我试图从文件中读取一些值并捕获可能发生的每个异常(在"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
一起使用,具体取决于您的实际情况)。