0

我有以下C#代碼:控制流是不越過如果在try塊發生異常到最後塊的try-終於

public class Program 
    { 
     static void Main() 
     { 
      int i = 123; 
      string s = "Some string"; 
      object obj = s; 

      try 
      { 
       // Invalid conversion; 
       i = (int)obj; 

       // The following statement is not run. 
       Console.WriteLine("WriteLine at the end of the try block."); 
      } 
      finally 
      { 
       Console.WriteLine("\n Finally Block executed !!!"); 
      } 
     } 
    } 

當一個異常發生程序崩潰,而不將控制傳遞給最終塊因爲它被理解爲finally塊必須被執行以釋放try塊中獲得的資源。

+0

正如你可以看到從[這個小提琴(https://dotnetfiddle.net/wf8DN9),這是不正確的。提供一個演示你的問題的[mcve]。 –

+0

是的,它會在dotnetfiddle上運行,但是當我在visual studio 2013上運行它時,它會拋出以下異常,而不會將控制權交給最終阻止,如同您的情況。未處理的異常:System.InvalidCastException:指定的轉換無效。 at exceptionHandling.Program.Main()in c:\ Users \ Kifayat \ Desktop \ Learn \ excepti onHandling \ exceptionHandling \ Program.cs:line 69 –

+2

它仍然會執行它。你可能會看到的是,Visual Studio在未執行的異常中斷,這將在執行finally塊之前執行。再次點擊'運行',finally塊會執行。 –

回答

0

通常,當未處理的異常結束應用程序時,是否運行finally塊並不重要。但是,如果在finally塊中有語句,即使在這種情況下也必須運行,一種解決方案是將catch塊添加到try-finally語句中。或者,您可以捕獲可能在調用堆棧上方try-finally語句的try塊中拋出的異常。也就是說,您可以在調用包含try-finally語句的方法或調用該方法的方法或調用堆棧中的任何方法中捕獲異常。如果未捕獲異常,則執行finally塊取決於操作系統是否選擇觸發異常展開操作。

編號:https://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

爲了驗證這一點,我想你的樣品是這樣,它執行finally塊。 試試這個:

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塊將總是被執行。 –