我想创建一个可以从尽可能多的错误中恢复的函数,然后重试。当然,有意义的错误处理在程序的其他部分也有涉及--这是保持程序运行的最后努力。所以我写了这个:
retryForever prog = catchAny prog progRetry
where
progRetry :: SomeException -> m a
progRetry ex = do
putStrLn $ pack $ show ex
threadDelay 4000
prog然后,我将主IO操作包装在retryForever中
main :: IO ()
main = retryForever $ do
logger <- newLogger
-- ...在我的程序的另一部分(可能是一个不同的绿色线程)中,我使用以下命令进行测试:
error "this is a TEST ERROR"结果是:
: this is a TEST ERROR
CallStack (from HasCallStack):
error, called at XXXX(程序会终止,而不是继续运行)
请注意,我使用classy-prelude,用于可能重要的情况,例如catchAny不处理异步异常,这可能是这里的问题所在。
发布于 2019-08-24 05:29:19
当程序失败时,您应该再次运行程序prog,但要将其包装在retryForever中,以便如果它再次失败,您可以继续尝试:
import Control.Monad.Catch(catchAll)
retryForever :: IO a -> IO a
retryForever prog = catchAll prog retry
where retry ex = do
putStrLn $ pack $ show ex
threadDelay 4000
retryForever proghttps://stackoverflow.com/questions/57633136
复制相似问题