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");
    }
}
4

5 回答 5

5

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

从上面的链接:

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

于 2011-11-19T07:28:33.397 回答
4

对我有用——至少在某种程度上。当我从命令行将其作为控制台应用程序运行时,“Test.exe 已停止工作。Windows 正在寻找解决方案”对话框立即出现,但如果我点击“取消”按钮,我会看到“终于运行”。如果我让初始对话框运行完成并且只留下 Debug 或 Close,那么点击 Close 将立即终止进程,而点击 Debug 显然会打开一个调试器。

编辑:马克霍尔的回答更详细地解释了这种行为。我会留下这个答案,因为它包含实验结果,但看看马克的答案:)

于 2011-11-19T07:24:53.707 回答
2

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

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

如果该finally块是事先执行的,那么您将无法在调试器中处理异常。

于 2011-11-20T10:23:59.647 回答
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(); }

于 2011-11-19T07:26:08.883 回答
0

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

于 2011-11-21T07:45:13.237 回答