8

私が理解しているように、次の2つの例は同じことをするはずです。なぜ最初の方が良いと考えられているのですか?

1:

try {
  riskyMethod();
}
catch(Exception e) {
  //handle exception
}
finally {
  cleanUp();
}

2:

try {
  riskyMethod();
}
catch(Exception e) {
  //handle exception
}
cleanUp();

編集:例はJavaですが、他の言語で使用されているように、一般的にfinallyブロックの概念について疑問に思っています

4

3 に答える 3

12

一つには、「例外の処理」部分がそれ自体で例外をスローした場合、クリーンアップは発生しません。

ただし、さらに重要なのは、すべての例外をキャッチすることはほとんどないはずです。処理できる非常に具体的な例外をキャッチし、他の例外をバブルアップさせる必要があります。その時点で、クリーンアップを引き続き実行する場合は、ブロックを使用する必要があります。finally

使用している言語は明確ではありませんが、Javaの場合、例外以外の例外(Throwableの他のサブクラス)は最初のバージョンではクリーンアップされますが、2番目のバージョンではクリーンアップされないため、すでに違いがあります。 tはException一般的にさえキャッチします。

個人的には、try/catchまたはtry/catch/finallyブロックよりもtry/finallyブロックの方が多いと思います。例外を実際に処理できることは非常にまれですが、作業中の抽象化レベルに適したものに変換して再スローするために、1つの例外をキャッチすることがあります。

編集:dj aqeelの回答に記載されているように、ブロックが例外なくfinally完了した場合、たとえばステートメントを介して、ステートメントも実行されます。私がそれを忘れていたという事実は、それを支持する正当な理由です:それは一貫性を促進します。これは、ブロックがどのように終了するかに関係なく、クリーンアップを実行するための1つの一貫した場所です。returnfinally

usingまた、C#では、使い捨てリソースのステートメントを慣例的に使用することに注意してください。また、Java7にはtry-with-resourcesステートメントがあります。

于 2011-09-15T06:13:07.010 に答える
9

finallyブロックのコードは常に実行されるため、returnステートメント、例外、またはtryまたはcatchブロックにステートメントを残す他のコントロールがある場合でも、finallyは、finallyブロックの直前にマシンの電源をオフにする以外の場合は常に実行されます。:)

于 2011-09-15T06:16:49.733 に答える
0

「最終的に」は、ここでクリーンアップを実行していることを明確に示しているためです。

于 2011-09-15T06:14:38.763 に答える