2011-09-15 16 views
4

私が理解するように、次の2つの例は同じことを行うべきです。 1位はなぜより良いと考えられるのですか?try/catchブロックの後にfinallyブロックとコードを書くことを使用する

1:

​​

2:

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

EDIT:例はJavaであるが、私はどの言語で使用されるように最終的には、一般的にブロックの概念について思ったんだけど

+0

@Greco:なぜC#タグを追加しましたか? –

答えて

12

「ハンドル例外」部分が例外自体をスローすると、クリーンアップは発生しません。

さらに重要なことに、あなたはほとんどである必要がありますすべて例外をキャッチします。処理できる非常に特殊な例外をキャッチし、他の例外をバブルアップさせる必要があります。その時点で、でなければなりません。ブロックがまだ発生している場合は、finallyブロックを使用してください。

あなたはどの言語を使用しているのかはっきりしませんが、Javaの場合は例外ではない例外(Throwableの他のサブクラス)が最初のバージョンではなく、一般的にはExceptionを捕まえるべきではありません。

個人的に私はtry/catchやtry/catch/finallyブロックよりtry/finallyブロックを多く書くことがわかります。私は非常に珍しい私は本当にの取引を処理することができます...私は時には私が取り組んでいる抽象レベルのために適切なものに変換するために1つの例外をキャッチし、その後再転覆。

EDIT:ジ・アキールの答えで述べたようにブロックは、例えば、例外なくを完了した場合、finally文も実行されていますreturnステートメントを介して。私がそれを忘れてしまったという事実は、finallyに有利な理由です:一貫性を促進します。ブロックがどのように終了するかにかかわらず、クリーンアップを実行するための一貫した場所です。

また、C#では、使い捨てリソースにusingステートメントをイディオムで使用することにも注意してください。 Java 7にはtry-with-resourcesというステートメントがあります。

+1

"私は、例外を本当に扱うことは非常にまれです。"どのように右!私は全く同じことを考えていた。 – Andreas

+1

+1あなたの答えに** dj aqeel **を言及しています。 –

+0

"すべての例外を捕まえることはほとんどありません" - UIレイヤー上で、ユーザーに簡単なメッセージを出力して、達成しようとしていたプロセスで何かが間違っていたことを示すことはどうでしょうか? – BornToCode

0

"finally"は、ここでクリーンアップを行っていることを明確に示しているためです。

9

return文、例外、またはtryやcatchブロックに他の制御を残していてもfinallyブロック内のコードは常に実行されるため、マシンの電源を切る以外の場合は常に最後に実行されます最終的にブロックする前に。 :)

+1

おっと、返信文を忘れてしまった。 –

+1

John Skeetは私の答えにコメントしました....私にとって大きな賞です... –

+0

実際には、「finally」が実行されない数多くのケースがあります。最も明白なのは 'System.exit()'が呼び出された場合、またはtryブロックのコードが決して終了しない場合です。 –

関連する問題