>>831
おそらく、あなたの期待している処理に関してだけ言えば、両者は代替可能だと言ってしまっても、
実用上それほど間違っていはないと思われます。

歯切れが悪い言い方で申し訳ないです。
というのも、正確に言えば両者は代替できない(と思う)からです。
>>827 でも同等性に関して「ほぼ」と断りました。

私が今ぱっと思いつく限りでは2つの異なる点があります。

ひとつは、bracketOnError の第3引数に(わざわざ)書いた開放処理の中で例外が起きれば、
その時点で bracketOnError の第2引数が実行されます。
第2引数でも開放処理が書かれていれば中途半端に二重に実行されます。
どう代替しますか?

もうひとつは外部例外への対処の仕方です(以後、簡単のため正確さは犠牲にします)。

両者の第1引数と第2引数では、外部例外がマスクされます。
一方、第3引数では外部例外のマスクが一時的に開放されます。
外部例外というのは他スレッドから現スレッドに投げられる例外の事だと今は思ってください。
これがマスクされているという事は、外部例外が投げられても処理を最後までやり切る、という事です。

したがって、bracket の第2引数に書いた開放処理と、bracketOnError の第3引数に書いた開放処理は、
外部例外への対応という点に関して異なります。
mask_ という関数を使って外部例外をマスクできますが、それで開放処理を書くのなら、
もうほとんど bracket の第2引数で開放処理を書くのと同義で、代替できると呼べるかどうか。


そもそも、代替できるかどうかに拘る理由が分かりません。
普通、bracketOnError を見たプログラマは、例外が発生しなければ第2引数は実行されない、
という前提でプログラムソースを読むはずです(ドキュメントにそう書かれているので)。
なので、第3引数に開放処理が書かれていれば混乱を生むだけだと思うのですが・・・