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 ...