2013-01-10 387 views
6

這是我的假設,只要程序運行,finally塊總是被執行。但是,在這個控制檯應用程序中,finally塊似乎並未得到執行。爲什麼最後不會執行?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       throw new Exception(); 
      } 
      finally 
      { 
       Console.WriteLine("finally"); 
      } 
     } 
    } 
} 

輸出

Result

注:當異常被拋出,窗戶askmed我,如果我想結束appliation,我說: '是的。'

+4

點擊'no'看看會發生什麼 –

+0

來看,它的命令行,而不是你的IDE – KevinDTimm

+0

內它看起來非常奇怪。 '最後'應該在StackTrace後寫完。 –

回答

2

當您獲得「ConsoleApplication1」已停止響應時,您有兩種選擇。

Windows Error Reporting dialog

如果按取消,將未處理的異常被允許繼續進行,直到最終的應用程序被終止。這允許finally塊執行。如果您不按取消,則Windows Error Reporting將暫停該進程,收集一個小型轉儲然後終止該應用程序。這意味着finally塊不會被執行。

或者,如果您以較高的方法處理異常,您肯定會看到finally塊。例如:

static void unhandled() 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    finally 
    { 
     Console.WriteLine("finally"); 
    } 
} 

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper; 
    try 
    { 
     unhandled(); 
    } 
    catch (Exception) 
    { 
     // squash it 
    } 
} 

總是給人輸出「終於」

6

它實際執行。只是你沒有注意到。只要你看到Windows is checking for a solution to the problem點擊取消並看到它。

enter image description here

+1

你在什麼環境中跑步?我正在使用Windows 7,64。當它詢問您「Windows正在檢查問題的解決方案..」時,請勿單擊取消。讓它做它的事情。 – Anish

+0

我正在使用Windows 7-32位。你是對的。 –

3

這有可能是你正在調試,當你點擊沒有,執行正在被調試器停止。

+0

這是真正的原因。 –

2

從命令行運行時。就在Windows試圖正常結束應用程序時,如果應用程序沒有響應,請單擊nocancelenter image description here

+0

你在什麼環境中跑步?我正在使用Windows 7,64。當它詢問您「Windows正在檢查問題的解決方案..」時,請勿單擊取消。讓它做它的事情。 – Anish

+0

然後Windows會終止應用程序,而不讓它打印到控制檯 –

-2

一個異常冒起堆棧,直到找到一個處理程序。如果沒有,程序退出。情況就是這樣......沒有處理程序,所以程序在碰到finally塊之前退出。

+2

-1 - 應該在*堆棧之前執行'finally' *事實上,*在堆棧展開期間*。 –

+0

最終的目的顯然是失去了它的用途,如果沒有一個捕獲?這對我來說是新的:L – RhysW

+0

對不起,這是一個沒有周折的答案。 – ktm5124

相關問題