Exception 异常能否在恢复和屏蔽之间潜行?

Exception 异常能否在恢复和屏蔽之间潜行?,exception,haskell,asynchronous,resources,Exception,Haskell,Asynchronous,Resources,假设我有一些这样编写的代码: import Control.Exception (bracketOnError, finally, mask) import Client (acquireB, releaseB, doStuff) -- theoretical import MyStuff (preliminary, doMoreStuff) -- theoretical clientAction = bracketOnError acquireB releaseB $ \b ->

假设我有一些这样编写的代码:

import Control.Exception (bracketOnError, finally, mask)
import Client (acquireB, releaseB, doStuff) -- theoretical
import MyStuff (preliminary, doMoreStuff) -- theoretical

clientAction = bracketOnError acquireB releaseB $ \b ->
  doStuff b
  return (b, releaseB b)

myAction = mask $ \restore ->
  a <- preliminary
  (thing, releaseThing) <- restore clientAction
  doMoreStuff a thing `finally` releaseThing
问题是:这里有时间吗

... restore $ mask ...

当客户端的
屏蔽被解除时,但在我的
还原操作结束之前,异常可能会潜入其中?

是的,在GHC中,当解除屏蔽发生时,我们急切地检查阻止的异常并将其提出来。

要解决问题,您可以将还原作为参数传递,Peaker Dan和我讨论了WAI使用的各种API,而不是围绕客户机代码进行恢复。我们确实讨论过将
restore
作为参数传递,但我担心用户很容易忘记取消异步异常的屏蔽。
... restore $ mask ...