在Haskell(ghc)Control.Exception中,try和catch之间的区别

在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系列函数时,每个异常处理程序都有一个隐含的掩码。这是因为这是您大多数时候想要的—它在启动异常处理程序时消除了常见

全部! 我有点困惑

库控件中的文档和代码之间是否存在不一致。异常

文档说明函数“catch”在处理函数上使用函数“mask” 但是函数尝试不使用函数掩码

但是代码说函数“try”使用函数“catch”

我认为 如果函数“catch”使用函数“mask” 函数“try”使用函数“catch”, 然后函数“try”使用函数“mask”


控制中。文件中说,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

谢谢。我现在明白了。