Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 何时使用';ioError。用户错误';而不是';错误';_Haskell_Error Handling - Fatal编程技术网

Haskell 何时使用';ioError。用户错误';而不是';错误';

Haskell 何时使用';ioError。用户错误';而不是';错误';,haskell,error-handling,Haskell,Error Handling,在阅读的源代码时,我注意到大量使用ioError(userError(“Error description”))在IO操作期间引发错误 由于这不是我第一次看到这个,我想知道使用这个模式而不是Prelude中的函数在实践中有什么不同 我知道,ioError。userError在IOmonad中引发一个,而error在任何地方引发一个,但最终两者似乎都注定要中止显示简单错误消息的程序 在哪种情况下ioError。userError比error更有利?传统上使用error仅表示bug。在某种意义上说,

在阅读的源代码时,我注意到大量使用
ioError(userError(“Error description”))
在IO操作期间引发错误

由于这不是我第一次看到这个,我想知道使用这个模式而不是
Prelude
中的函数在实践中有什么不同

我知道,
ioError。userError
IO
monad中引发一个,而
error
在任何地方引发一个,但最终两者似乎都注定要中止显示简单错误消息的程序


在哪种情况下
ioError。userError
error
更有利?

传统上使用
error
仅表示bug。在某种意义上说,开发人员希望永远不会发生的事情已经发生了。尽管
error
确实只是抛出了一个
ErrorCall
异常,它可以像捕获任何其他异常一样被捕获,但传统的做法是永远都不会捕获它,因此程序崩溃,并将作为
error
参数提供的消息告知最终用户错误。例如,稍后用户可以将该信息发布到问题跟踪器上

另一方面,
IOException
s意味着被捕获,只是标准C/Java控制流的一种改编。
userError
通常用于指定一些一般情况,当类似的
AlreadyExists
ResourceBusy
都不合适时


必须提到的是,这两个问题的解决方案都已经形成

对于bug报告,存在基于TemplateHaskell的库,如and,它扩展了
错误
,以引用源代码中的特定位置,以及其他细节,如“todo”假人,允许编译通过,但带有警告


任何类型的例外都被公认为是对原本整洁的Haskell类型系统的入侵。最大的问题是,您和编译器都不知道某些计算(例如,
IO()
)是否会引发任何类型的异常。这已经被证明是可怕的,出现了一种异常模式,这种异常模式是由深度嵌套在依赖关系层次结构中的某个低级库抛出的,它会在不同的项目上触发一系列错误报告,并造成大量痛苦。这就是为什么最近出现了基于异常的控制流的完全替换,例如使用相关的或。这两种解决方案都在类型系统中显式表示异常。然而,
error
支持
EitherT
+“errors”。

你也可以注意到haskell.org所说的:
IOException记录了一种更具体的错误类型,一个描述性的字符串,可能还有在标记错误时使用的句柄。
此外,这里还有一个SO链接,描述了,你可以说,按照惯例,一个
ErrorCall
被支持永远不会被捕获,但是捕获一个
userError
并对其进行处理是可以的?@dannynnavarro是的。确切地