该函数forkFinally
要求您针对SomeException
. 我需要的是一种重新抛出未处理异常的方法。这是一个示例代码,它无法编译,因为在最后一行e
是模棱两可的:
finallyHandler :: Either SomeException () -> IO ()
finallyHandler z = case z of
Right () -> cleanUp
Left someE | Just ThreadKilled <- fromException someE -> cleanUp
| Just e <- fromException someE -> cleanUp >> throwIO e
当然首先想到的是简单地抛出someE
,即:
...
| otherwise -> cleanUp >> throwIO someE
SomeException
确实它会编译,但是当它们通过这个处理程序时,它会导致所有传入异常的包装。这不可能是对的。如果我在堆栈中有多个这样的处理程序怎么办 - 我会得到一个像SomeException $ SomeException $ RealException
.
我错过了什么吗?处理这种情况的正确方法是什么?