如何发现Haskell中可以抛出哪些异常?

时间:2019-05-23 13:08:53

标签: haskell exception

最近使用wreq时,我编写了经过一段时间编译和工作的代码。然后,抛出了HttpExceptionHttpException中未定义wreq。我不得不将其追踪到http-client。然后,再过一会儿,抛出了JSONError。在wreq中也未定义,但在aeson中未定义。

我如何找出黑匣子库中可能抛出的异常,而不是通读该库的所有可用文档以及所有依赖库,以希望作者提到了该异常?

1 个答案:

答案 0 :(得分:0)

Haskell中没有任何方法可以确定函数可能抛出的运行时异常。

如果您来自Java及其“ checked”和“ unchecked”异常,则应考虑所有Haskell运行时异常均未选中。注释中,Haskell等效于检查异常通常是使用MaybeEitherExceptT或类似评论中提到的方法将它们合并到结果类型中。

对于未检查的运行时异常与其他机制的适当使用,存在不同的看法,并且库作者将对错误处理做出不同的决定,所以您一定会屈服于他们。

在这种情况下,wreq的文档非常清楚地表明可以抛出HttpExceptionJSONError,但是不能保证该库或任何其他库的文档都是正确的/ complete或该从属库不会引发未列出的其他异常。 (注意:JSONError实际上是在wreq中定义的。aeson包不使用异常来表示JSON解码错误。)

在生产代码中,您需要确保已安装适当的“所有异常”处理程序。