簡體   English   中英

如何使用異常處理在Haskell中編寫“retryForever”函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM