[英]How to write a “retryForever” function in Haskell using exception handling?
我想創建一個可以從合理的錯誤中恢復的函數,然后再試一次。 當然,程序的其他部分也包含有意義的錯誤處理 - 這是保持運行的最后努力。 所以我寫了這個:
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
不會處理那里的異步異常,這可能是這里的問題。
當程序失敗時,你應該再次運行程序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 prog
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.