在Haskell(ghc)Control.Exception中,try和catch之间的区别
全部! 我有点困惑 库控件中的文档和代码之间是否存在不一致。异常 文档说明函数“catch”在处理函数上使用函数“mask” 但是函数尝试不使用函数掩码 但是代码说函数“try”使用函数“catch” 我认为 如果函数“catch”使用函数“mask” 函数“try”使用函数“catch”, 然后函数“try”使用函数“mask”在Haskell(ghc)Control.Exception中,try和catch之间的区别,exception,haskell,asynchronous,try-catch,ghc,Exception,Haskell,Asynchronous,Try Catch,Ghc,全部! 我有点困惑 库控件中的文档和代码之间是否存在不一致。异常 文档说明函数“catch”在处理函数上使用函数“mask” 但是函数尝试不使用函数掩码 但是代码说函数“try”使用函数“catch” 我认为 如果函数“catch”使用函数“mask” 函数“try”使用函数“catch”, 然后函数“try”使用函数“mask” 控制中。文件中说,ghc基本包除外 “调用catch系列函数时,每个异常处理程序都有一个隐含的掩码。这是因为这是您大多数时候想要的—它在启动异常处理程序时消除了常见
控制中。文件中说,ghc基本包除外 “调用catch系列函数时,每个异常处理程序都有一个隐含的掩码。这是因为这是您大多数时候想要的—它在启动异常处理程序时消除了常见的争用条件,因为如果一个异常立即到达,堆栈上可能没有异常处理程序来处理另一个异常。但是,如果异步异常在进入处理程序时被屏蔽,我们就有时间在被中断之前安装一个新的异常处理程序。如果这不是默认值,那么就必须编写如下内容
mask $ \restore ->
catch (restore (...))
(\e -> handler)
如果需要在异常处理程序中再次取消阻止异步异常,也可以在那里使用restore
请注意,try和friends没有类似的默认值,因为在这种情况下没有异常处理程序。不要使用try从异步异常中恢复。“
但是,代码说
“try a=catch(a>>=\v->return(Right v))(\e->return(Left e))”此注释的意思是,如果您像这样使用
try
:
e <- try act
case e of
Left e -> handleError e
Right r -> doSomething r
e手柄错误e
右r->剂量仪r
术语
handleError e
周围没有遮罩,不像catch-act-handleError
谢谢。我现在明白了。