87

私は何年もの間、多くの言語でtry-catch / exception-finallyバリアントを使用してきましたが、今日、誰かが最終的に何を意味するのかと尋ねてきましたが、答えることができませんでした。

基本的に、try-catchブロック全体の後にステートメントを配置するのではなく、最終的にステートメントを配置するのはなぜですか?つまり、次のコードブロックには違いがあります。

try{ //a}
catch {//b}
finally {//c}


try{//a}
catch{//b}
//c

編集:
人々、私は最終的に何をするのか知っています、私はそれを何年もの間使用しています、しかし私の質問は上記の例//cでは最終的に入れることは冗長に見えますね?

4

5 に答える 5

122

ブロックの目的は、finally"catch" ブロックだけではきれいに処理できない 3 つの状況でコードが実行されるようにすることです。

  1. tryブロック内のコードがreturn
  2. ブロック内のコードcatchがキャッチされた例外を再スローするか、偶然または意図的に新しい例外をスローすることになります。
  3. ブロック内のコードでtry例外が発生したtry場合、 catch.

finallyeveryreturnまたは throwの前にコードをコピーし、catchブロックを独自の try/catch 内にラップして、偶発的な例外が発生する可能性を考慮することもできますが、それをすべて忘れて単純にfinallyブロックを使用する方がはるかに簡単です。

ところで、私が言語設計者に含めてほしいことの 1 つは、ブロックexceptionへの引数finallyです。これは、例外の後でクリーンアップする必要があるが、それでもコール スタックに浸透させたい場合に対処するためです (たとえば、次のコードをラップできます)。そのようなコンストラクト内のコンストラクター、およびDisposeコンストラクターが例外で終了する場合は構築中のオブジェクト)。

于 2012-03-13T16:30:59.887 に答える
2

try ブロックで例外がスローされた場合でも、finally ブロックが実行されます。したがって、たとえば、以前にストリームを開いた場合、例外がスローされるかどうかにかかわらず、そのストリームを閉じたい場合があります。finally ブロックは、このような問題に役立ちます。

于 2012-03-13T16:24:24.543 に答える
-1

Finally例外が発生した場合でも、コードが実行されることを確認してください。

finally ブロックは、try ブロックで割り当てられたリソースをクリーンアップしたり、例外が発生した場合でも実行する必要があるコードを実行したりするのに役立ちます。

http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.80).aspx

于 2012-03-13T16:19:08.867 に答える