2011-11-19 65 views
4

我假設我在這裏錯過了一些非常微不足道的東西,但是因爲這對我來說並不明顯。無論是否有例外,我總是認爲「終於」會一直執行。爲什麼我的「終於」不會跑?

無論如何,這段代碼無法運行,我不知道爲什麼。它到達i = i/j並拋出一個DivideByZero異常,但我會認爲它會繼續並在停止之前執行finally語句。

static void Main(string[] args) 
{ 
    int i = 1; 

    try 
    { 
     int j = 0; 
     i = i/j; 

     Console.WriteLine("can't get"); 
    } 
    finally 
    { 
     Console.WriteLine("finally ran"); 
    } 
} 
+0

奇怪!我一直認爲這段代碼最終會出現編譯時錯誤。我試了一下,它的行爲與Jon Skeet在他的回答中提到的方式完全相同。 –

回答

5

看看這個MSDN try-finally (C# Reference)

從上面的鏈接:

通常,當一個未處理的異常結束一個應用程序時,是否或者 不是最後塊運行並不重要。但是,如果在即使在這種情況下必須運行的finally塊中有 語句, 解決方法之一就是將try塊添加到try-finally語句中。

4

適用於我 - 至少有點。當我從命令行運行這個控制檯應用程序時,「Test.exe停止工作,Windows正在尋找解決方案」對話框立即出現,但如果我點擊「取消」按鈕,我會看到「終於運行了」。如果我讓初始對話框運行完成,並且只剩下Debug或Close,那麼點擊Close將立即終止進程,並且調試顯然會調出一個調試器。

編輯:Mark Hall's answer更詳細地解釋了行爲。我會離開這個答案了,因爲它包含的實驗結果,但看看馬克的回答:)

+0

確實很奇怪。我正在使用Visual Studio 2010 Express來運行此操作,它遇到了異常,然後我無法再繼續操作。也許我必須改變我的例外處理設置... – Diskdrive

+0

啊,而且,「尋找解決方案」的東西,我會認爲這太奇怪了。因爲我會認爲它會觸發異常,只是繼續而不提示。這是控制檯應用程序的行爲嗎? – Diskdrive

+0

@stirfry:不,因爲你沒有捕捉到異常。它表明程序中的失敗使得程序*不應該繼續*。 –

0

試試這個:


static void Main(string[] args) 
    { 
     int i = 1;

try { int j = 0; i = i/j; Console.WriteLine("can't get"); } catch(Exception ex){ Console.WriteLine(ex.Message); } finally { Console.WriteLine("finally ran"); } Console.WriteLine("Press enter to exit..."); Console.ReadLine(); }

2

馬克的回答說:會發生什麼,但我想我會提到爲什麼:

我相信這是允許任何外部處理器到處理器異常的finally塊之前被處理被執行。 (例如,當附加調試器,它可以嘗試異常點打破,讓您繼續finally塊開始運行之前。)

如果finally塊提前執行,那麼你就不能在調試器中處理異常。

0

我想你可能需要一個catch來捕捉異常,然後finally會運行。