我试图从文件中读取一些值并捕获可能发生的每个异常(在"更容易请求宽恕而非许可"的思维模式中).我在捕捉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
(可能与force
from一起使用,具体取决于您的实际情况)。Control.DeepSeq
归档时间: |
|
查看次数: |
1163 次 |
最近记录: |