首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用异常处理在Haskell中编写"retryForever“函数?

如何使用异常处理在Haskell中编写"retryForever“函数?
EN

Stack Overflow用户
提问于 2019-08-24 05:19:32
回答 1查看 123关注 0票数 3

我想创建一个可以从尽可能多的错误中恢复的函数,然后重试。当然,有意义的错误处理在程序的其他部分也有涉及--这是保持程序运行的最后努力。所以我写了这个:

代码语言:javascript
复制
retryForever prog = catchAny prog progRetry
  where
    progRetry :: SomeException -> m a
    progRetry ex = do
      putStrLn $ pack $ show ex
      threadDelay 4000
      prog

然后,我将主IO操作包装在retryForever

代码语言:javascript
复制
main :: IO ()
main = retryForever $ do
  logger <- newLogger
  -- ...

在我的程序的另一部分(可能是一个不同的绿色线程)中,我使用以下命令进行测试:

代码语言:javascript
复制
error "this is a TEST ERROR"

结果是:

代码语言:javascript
复制
: this is a TEST ERROR
CallStack (from HasCallStack):
  error, called at XXXX

(程序会终止,而不是继续运行)

请注意,我使用classy-prelude,用于可能重要的情况,例如catchAny不处理异步异常,这可能是这里的问题所在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-24 05:29:19

当程序失败时,您应该再次运行程序prog,但要将其包装在retryForever中,以便如果它再次失败,您可以继续尝试:

代码语言:javascript
复制
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 prog
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57633136

复制
相关文章

相似问题

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