我试图从文件中读取一些值并捕获可能发生的每个异常(在"Easier to ask for forgiveness than permission"的心态中)。我在捕获Prelude.read: no parse异常时遇到了麻烦。为了告诉try它应该捕获每个异常,我用显式类型tryAny定义SomeException,据我所知,它是每个异常的“ super 类型”:

import Control.Exception (try,SomeException)
tryAny :: IO a -> IO (Either SomeException a)
tryAny = try

使用tryAny我似乎能够捕获IO错误:
> tryAny (fromFile "nonExistingFileName")
Left nonExistingFileName: openFile: does not exist (No such file or directory)

但是不会捕获读取错误:
> tryAny (return ((read "a")::Int))
Right *** Exception: Prelude.read: no parse

我应该怎么做才能捕捉到每个异常?

最佳答案

return不评估其参数,因此不会引发任何异常。当您尝试打印结果时,评估发生在tryAny之外。

为此使用evaluate(可能与force中的Control.DeepSeq一起使用,具体取决于您的实际情况)。

10-06 01:06