web-dev-qa-db-ja.com

try catch / exceptfinallyステートメントのfinallyのポイントは何ですか

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

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

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


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

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

67
Ali

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

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

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

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

87
supercat

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

2
Ahmet B. Badın

Finally例外が発生した場合でも、コードが実行されるようにしてください。

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

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

0