为什么我的“终于”不会跑了?

时间:2011-11-19 07:22:07

标签: c#-4.0 try-catch-finally

我认为我在这里遗漏了一些非常微不足道的东西,但由于理由这对我来说并不明显。无论是否有异常,我总是认为“最终”总是会执行。

无论如何,这段代码无法运行,我不知道为什么。它到达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");
    }
}

5 个答案:

答案 0 :(得分:5)

看看这个MSDN try-finally (C# Reference)

从上面链接:

  

通常,当未处理的异常结束应用程序时,无论是否   不是finally块运行并不重要。但是,如果你有   finally块中的语句,即使在那种情况下也必须运行,   一个解决方案是在try-finally语句中添加一个catch块。

答案 1 :(得分:4)

适合我 - 至少在某种程度上。当我从命令行运行它作为控制台应用程序时,“Test.exe已停止工作.Windows正在寻找解决方案”对话框立即出现,但是如果我点击“取消”按钮,我看到“终于跑了”。如果我让初始对话框运行完成,然后继续使用Debug或Close,那么点击Close将立即终止进程 ,然后点击Debug显然会调出一个调试器。

编辑:Mark Hall's answer更详细地解释了这种行为。我会留下这个答案,因为它包含实验结果,但看看Mark的答案:)

答案 2 :(得分:2)

Mark的回答说发生了什么,但我想我会提到原因:

我相信这是为了允许任何外部处理程序处理在执行finally块之前处理的异常。 (例如,当附加调试器时,它可以尝试在异常点处中断,允许您在finally块开始运行之前继续。)

如果预先执行了finally块,那么您无法在调试器中处理异常。

答案 3 :(得分: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(); }
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(); }

答案 4 :(得分:0)

我认为您可能需要catch才能在finally运行之前捕获异常。