この関数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
。
何か不足していますか?この状況を処理する適切な方法は何ですか?