0

のtryブロックで発生した場合、私は、次のC#のコードを持つブロックするために見逃していませんtryブロックで得られたリソースを解放するためにfinallyブロックを実行しなければならないことが理解されるからです。制御フローは、最終的には例外がしようと、最終的には

+0

を、これは真実ではありません。あなたの問題を示す[mcve]を提供してください。 –

+0

はい、それはdotnetfiddleで動作しますが、私はVisual Studio 2013でそれを実行している間、あなたの場合のように、最後にブロックするように制御を渡すことなく次の例外をスローします。未処理の例外:System.InvalidCastException:指定されたキャストが無効です。 at exceptionHandling.Program.Main()in c:\ Users \ Kifayat \ Desktop \ Learn \ excepti onHandling \ exceptionHandling \ Program.cs:行69 –

+2

それでも実行されます。あなたが見ている可能性があるのは、finallyブロックが実行される前の、未処理の例外をVisual Studioが壊すことです。 'Run'をもう一度押すとfinallyブロックが実行されます。 –

答えて

0

通常、処理されない例外がアプリケーションを終了した場合、finallyブロックが実行されているかどうかは重要ではありません。しかし、その状況でも実行されなければならないfinallyブロック内にステートメントがある場合、try-finallyステートメントにcatchブロックを追加する方法があります。また、呼び出しスタックの上位にあるtry-finallyステートメントのtryブロックにスローされた例外をキャッチすることもできます。つまり、try-finallyステートメントを含むメソッドを呼び出すメソッド、またはそのメソッドを呼び出すメソッド、または呼び出しスタック内のすべてのメソッドで例外をキャッチすることができます。例外がキャッチされない場合、finallyブロックの実行は、オペレーティングシステムが例外の巻き戻し操作をトリガするかどうかによって異なります。

参考:https://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

これを検証するためには、私はこのようなあなたのサンプルを試してみましたが、それは最終的にブロックを実行します。 この試してみてください:あなたは、[このフィドル](https://dotnetfiddle.net/wf8DN9)から見ることができるように

public class MainClass { 
public static void Main() 
{ 
    try { 
     Invalid(); 
    } 
    catch (Exception ext) { 
     Console.Write(ext.Message); 
    } 
} 

public static void Invalid() 
{ 
    string message = "new string"; 
    object o = message; 
    try 
    { 
     int i = (int)o; 
    } 
    finally 
    { 
     Console.WriteLine("In finally"); 
    } 
} 
} 
+0

「解決策」は必要ありません。 finallyブロックは常に*実行されます。 –

関連する問題