一つには、「例外の処理」部分がそれ自体で例外をスローした場合、クリーンアップは発生しません。
ただし、さらに重要なのは、すべての例外をキャッチすることはほとんどないはずです。処理できる非常に具体的な例外をキャッチし、他の例外をバブルアップさせる必要があります。その時点で、クリーンアップを引き続き実行する場合は、ブロックを使用する必要があります。finally
使用している言語は明確ではありませんが、Javaの場合、例外以外の例外(Throwableの他のサブクラス)は最初のバージョンではクリーンアップされますが、2番目のバージョンではクリーンアップされないため、すでに違いがあります。 tはException
一般的にさえキャッチします。
個人的には、try/catchまたはtry/catch/finallyブロックよりもtry/finallyブロックの方が多いと思います。例外を実際に処理できることは非常にまれですが、作業中の抽象化レベルに適したものに変換して再スローするために、1つの例外をキャッチすることがあります。
編集:dj aqeelの回答に記載されているように、ブロックが例外なくfinally
完了した場合、たとえばステートメントを介して、ステートメントも実行されます。私がそれを忘れていたという事実は、それを支持する正当な理由です:それは一貫性を促進します。これは、ブロックがどのように終了するかに関係なく、クリーンアップを実行するための1つの一貫した場所です。return
finally
using
また、C#では、使い捨てリソースのステートメントを慣例的に使用することに注意してください。また、Java7にはtry-with-resourcesステートメントがあります。