例外

2009-05-23 11 views
3

可能性の重複:
In C# will the Finally block be executed in a try, catch, finally if an unhandled exception is thrown ?例外

は、最終的には(C#で)このシナリオで実行されますか?

try 
{ 
    // Do something. 
} 
catch 
{ 
    // Rethrow the exception. 
    throw; 
} 
finally 
{ 
    // Will this part be executed? 
} 
+0

この複製(またはそこにリンクされている他の複製のいずれか)を参照してください:http://stackoverflow.com/questions/833946/in-c-will-the-finally-block-be-executed-in-a-try -catch-finally-if-an-unhandled –

答えて

11

はい、最終的には常に実行されます。

動作を実証するための簡単な例:

private void Button_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     ThrowingMethod(); 
    } 
    catch 
    { 
    } 
} 

private void ThrowingMethod() 
{ 
    try 
    { 
     throw new InvalidOperationException("some exception"); 
    } 
    catch 
    { 
     throw; 
    } 
    finally 
    { 
     MessageBox.Show("finally"); 
    } 
} 
1

はい。

これを簡単にテストできます。

しかし、あなたが質問するという事実はtry/finallyブロックの中にネストされたtry/catchブロックとしてこれを書くのに良い議論です。目のはるかに簡単です。

3

(編集:コメントの明確化 - ありがとう)
最後に常に実行されます。私が知っている唯一の例外は次のとおりです。

  • 所属するメインプログラムが終了しているため、「背景」は、そのスレッドでブロックし、最終的に終了したとして実行しているスレッドが実行されない場合は、電源プラグ
  • を引きます。 Joseph Albahariを参照してください。
  • その他のスタックオーバーフローやメモリ不足などの非同期例外。 this questionを参照してください。

最終的に実行されないシナリオのほとんどは、バックグラウンドスレッド1を除き、壊滅的な失敗と関係しているため、特にそのことを認識する価値があります。

+0

この関連の解説を参照してください:http://stackoverflow.com/questions/833946/in-c-will-the-finally-block-be-executed-in-a-try-キャッチ - 最終的には未処理の場合 –

+0

"唯一の2つの例外..."他にもあります。例えば。 Environment.FailFast。 – Joe

+0

Thanks DivoとJoe - 私はそこで新しいことを学びました。 – Frans