如果modifyIORef内部发生错误,有没有办法不修改IORef值
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发布于 2016-05-07 01:27:11
我相信您可以使用包装在异常处理程序中的modifyIORef'或atomicModifyIORef'来做到这一点。我一般不推荐这样做;error调用会生成供用户阅读的字符串,而不是提供给处理程序的详细信息。处理“纯”代码抛出的异常的整个“不精确异常”机制需要非常小心才能正确使用。你最好确保不从纯代码中抛出异常。ExceptT和Either等可以提供帮助。
发布于 2016-05-07 01:17:31
Haskell的错误处理方式与Python和Java等其他语言不同。当您调用error函数时,程序将暂停。句号。无法捕获错误。没有办法重定向它,也没有办法重新启动程序。error函数会引发错误,而不是异常。如果您想在Haskell中表示失败的概念,您可以使用Maybe和Either monads。下面是如何使用Either monad实现您想要的功能。
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中的错误。但是,除非在非常特殊的情况下,否则它被认为是不好的做法,因此使用Maybe和Either类型仍然是首选。
https://stackoverflow.com/questions/37077879
复制相似问题