ensure: の罠

ensure: はエラーが起きても、プロセスが終了させられても、
実行することが保障される優れもののように思われるが、
実際のところ、本当にプロセスが終了させられる可能性のあるコードでは問題がある。

[ "ここでプロセスが終了されられる場合は問題ない。" ] ensure: [
"しかしここでプロセスが終了させられるとエラーとなるのだ!"
].

それと、当然と言えば当然なのだが、プロセスが終了させられた場合に、
ensure:のハンドラー側のブロックは新しい別のプロセスで実行される。
やはりマルチスレッドの場合には思わぬ何かを引き起こす原因になるのかもしれない。

また、例外投入時の実行順序も、
実際のブロックの入れ子関係とは無関係であるという落とし穴もある。
[ [ Exception signal ] ensure: [ "A" ] ] on: Exception do: [ "B" ].
の場合、on:do:のターゲット"B"が先に実行され、
その後ensure:のターゲット"A"が実行されるらしいのだ。
これもちゃんと知っていないと思わぬ結果を招きそうだ。