请考虑以下程序。
import Control.Monad.State
import Control.Monad.Catch
ex1 :: StateT Int IO ()
ex1 = do
modify (+10)
liftIO . ioError $ userError "something went wrong"
ex2 :: StateT Int IO ()
ex2 = do
x <- get
liftIO $ print x
ex3 :: StateT Int IO ()
ex3 = ex1 `onException` ex2
main :: IO ()
main = evalStateT ex3 0
当我们运行程序时,我们得到以下输出。
$ runhaskell Test.hs
0
Test.hs: user error (something went wrong)
然而,我期望输出如下。
$ runhaskell Test.hs
10
Test.hs: user error (something went wrong)
如何在异常处理程序ex2
中保留ex1
中的中间状态?
1条答案
按热度按时间dpiehjr41#
请使用
IORef
(或MVar
或TVar
或其他)来代替。这感觉像一个模式,我已经看到了足够的时间,应该有一个黑客包,但我不知道一个。