我试图从文件中读取一些值并捕获可能发生的每个异常(在"更容易请求宽恕而非许可"的思维模式中).我在捕捉Prelude.read: no parse异常时遇到了麻烦.要告诉try它应该捕获我tryAny使用显式类型定义的每个异常SomeException,据我所知,这是每个异常的"超类型":
import Control.Exception (try,SomeException)
tryAny :: IO a -> IO (Either SomeException a)
tryAny = try
Run Code Online (Sandbox Code Playgroud)
随着tryAny我似乎能够赶上IO错误:
> tryAny (fromFile "nonExistingFileName")
Left nonExistingFileName: openFile: does not exist (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
但是不会捕获读取错误:
> tryAny (return ((read "a")::Int))
Right *** Exception: Prelude.read: no parse
Run Code Online (Sandbox Code Playgroud)
我能做些什么来捕捉每一个例外?
return不评估其参数,因此不会引发任何异常。tryAny当您尝试打印结果时,评估发生在 之外。
为此使用evaluate(可能与forcefrom一起使用,具体取决于您的实际情况)。Control.DeepSeq