错误和失败之间有什么区别?

arr*_*owd 5 error-handling haskell

我一直在寻找这个问题的答案,并找到了这篇博文.它说它fail有优势,error因为它不受IOmonad的限制.

我应该使用fail而不是error全部代码吗?是否会fail引发Control.Exception.catch异常IO

编辑:我发现上面的链接更新.

kos*_*kus 7

这是我的建议:

  • 如果您IO已经使用了代码,请通过throwIOfrom 使用正确的异常Control.Exception.

  • 如果您的代码已经使用了monad堆栈,如果它已经不支持monad堆栈,请添加错误,并使用它们.

  • 如果您使用非monadic代码,请编写总函数.即,error如果可以的话,避免和不完整的模式.fail在这里使用只会强制你的代码不必要的monadic.如果需要特殊效果,请使用正确的数据类型(如MaybeEither或自定义的数据类型).

  • 我认为有一个正确的地方可以使用`error`.那时代码的前提条件没有在其类型中表达,并且违反了这些条件.也就是说,当代码因程序员错误而失败时,输入就不错了. (2认同)