无法使用Control.Exception.try捕获"Prelude.read:no parse"异常

Per*_*ids 5 haskell

我试图从文件中读取一些值并捕获可能发生的每个异常(在"更容易请求宽恕而非许可"的思维模式中).我在捕捉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)

我能做些什么来捕捉每一个例外?

Rom*_*aka 4

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

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

  • 使用显式模拟故障的解析库可能比“评估”更简单。即除“阅读”之外的任何内容。 (2认同)
  • 最近版本的“base”中有“readMaybe”。但这个问题似乎是关于异常,而不是解析。 (2认同)