2011-08-05 143 views
0

.net 4控制台应用程序示例为什么这最后不能执行?

当我在vs 2010中运行它时,它似乎一直在抛出(从catch)并且永远不会到达finally。它打破了投掷并显示了异常,我打了f5,它几乎就像在投掷中循环一样。在另一个exe文件中使用相似的代码,我能够将异常抛出到控制台并执行finally进行清理。情况并非如此,我想知道为什么。

static void Main(string[] args) 
    { 
     try 
     { 
      throw new Exception("Exception"); 
     } 
     catch(Exception) 
     { 
      Console.WriteLine("Catch"); 
      throw; 
     } 
     finally 
     { 
      Console.WriteLine("Finally"); 
     } 
    } 
+2

它应该写入“Catch”,然后是“Finally”,然后由于异常而崩溃。发生什么事了吗? –

+0

它的循环因为在你的catch语句中抛出了相同的异常。 –

+8

@ramhound呃,不,一旦你处于“catch”状态,那么投掷并不会让你回到那个“catch”部分的开始! –

回答

10

相反,它确实执行finally块。这是输出:

Catch 

Unhandled Exception: System.Exception: Exception at ConsoleApplication1.Program.Main(String[] args) in C:\Desktop\ConsoleApplication1\Program.cs:line 24 
Finally 
+0

我同意,我看到相同的结果。 – Leons

2

我敢打赌最终实际执行,但在控制台应用程序的主要方法是,在最后的控制台对象不再可用。

+0

在我的测试中,添加一个断点表明情况是这样的 - 它绝对会触及最后。也许控制台已经停止了这个观点。 – Fenton

2

如果我在调试过程中启动程序,则代码将停止并显示消息“未处理的异常”,最后才会执行该消息。无需调试即可运行(CTRL-F5)。

使用调试器可以验证最终被通过移动testcode内的另一个try-catch块执行,例如:

static void Main(string[] args) 
{  
    try 
    { 
     Method(); 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("caught in main"); 
    } 
    Console.ReadKey(); 
} 
public static void Method() 
{ 
    try 
    { 
     throw new Exception("Exception"); 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("Catch"); 
     throw; 
    } 
    finally 
    { 
     Console.WriteLine("Finally"); 
    } 
} 
+0

我在OP代码中的finally块中没有问题。 –

0

你能保证它确实执行,如@大卫赫弗南证明他输出;然而,你可能会考虑什么是为了在C#规范(8.10)表示有信心,是应该是:当控制 离开try语句

一个finally块中的语句总是被执行。无论由于执行 break,continue,goto或return语句,还是作为 将trya语句中的异常传播出去而导致正常执行的结果,控制转移 都会发生。

相关问题