首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发生错误时IORef保持值

发生错误时IORef保持值
EN

Stack Overflow用户
提问于 2016-05-07 01:06:01
回答 2查看 145关注 0票数 1

如果modifyIORef内部发生错误,有没有办法不修改IORef值

代码语言:javascript
复制
import Data.IORef

main = do
  a <- newIORef (1::Int)

  -- a keeps error now, not Int
  modifyIORef a (const $ error "Error forever")

  val <- readIORef a  -- val is error now
  putStrLn $ "Result: " ++ show val -- throws error
EN

回答 2

Stack Overflow用户

发布于 2016-05-07 01:27:11

我相信您可以使用包装在异常处理程序中的modifyIORef'atomicModifyIORef'来做到这一点。我一般不推荐这样做;error调用会生成供用户阅读的字符串,而不是提供给处理程序的详细信息。处理“纯”代码抛出的异常的整个“不精确异常”机制需要非常小心才能正确使用。你最好确保不从纯代码中抛出异常。ExceptTEither等可以提供帮助。

票数 2
EN

Stack Overflow用户

发布于 2016-05-07 01:17:31

Haskell的错误处理方式与Python和Java等其他语言不同。当您调用error函数时,程序将暂停。句号。无法捕获错误。没有办法重定向它,也没有办法重新启动程序。error函数会引发错误,而不是异常。如果您想在Haskell中表示失败的概念,您可以使用MaybeEither monads。下面是如何使用Either monad实现您想要的功能。

代码语言:javascript
复制
main = do
  a <- NewIORef (Right 1 :: Either String Int)
  modifyIORef a (const $ Left "some execution error")  
  -- a now holds a "Left" value, representing an error
  val <- readIORef a 
  -- val now holds the "Left" value
  case val of
    Left err -> putStrLn $ "Error: " ++ err -- prints error (if applicable)
    Right val -> putStrLn $ "Result: " ++ show val -- prints value (if applicable)

编辑:正如dfeuer在他的评论中友好地指出的那样,可以截取GHC中的错误。但是,除非在非常特殊的情况下,否则它被认为是不好的做法,因此使用MaybeEither类型仍然是首选。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37077879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档