当内部“捕获”抛出时,为什么外部“终于”没有被执行?

时间:2012-03-23 00:47:01

标签: c# exception exception-handling try-catch

我写了一个简单的程序来测试一个理论,即“最终”块总是会执行,无论如何。 但是,我从下面的pgm看到的是控制似乎永远不会进入外部最终区块。

我尝试在Visual Studio中执行F5和Ctrl-F5,结果相同。

有人可以解释为什么我会看到这种行为吗?

控制台窗口的输出是:

内部捕获

内心终于

外部捕获

未处理的例外:

..然后应用程序崩溃

public class Program
{
    static void Main()
    {
        try
        {
            try
            {
                string s = null;
                s.ToString();
            }
            catch
            {
                Console.WriteLine("inner catch");
                throw;
            }
            finally
            {
                Console.WriteLine("inner finally");
            }

            return;
        }
        catch
        {
            Console.WriteLine("outer catch");
            throw;
        }
        finally
        {
            Console.WriteLine("outer finally");
        }
    }
}

2 个答案:

答案 0 :(得分:8)

在处理异常之后运行“外部最终”。

以下是在调试器外部运行此代码的输出:

inner catch
inner finally
outer catch

Unhandled Exception: System.NullReferenceException: Object reference not set to
an instance of an object.
   at SOConsole.Program.Main() in c:\Users\DaveShaw\Documents\Visual Studio 11\Pro
jects\SO\SOConsole\Program.cs:line 35
outer finally
Press any key to continue . . .

发生异常时,显示以下内容: Exception

点击“取消”后,应用程序恢复并显示“外部最终”。

如果由于某种原因你在有机会进入“最终外部”之前关闭你的应用程序,那么你将永远不会看到你的消息。如果应用程序的进程被“终止”,则跳过最后的进程,以防它们包含阻止应用程序关闭的代码。否则可能无法终止该过程。

答案 1 :(得分:4)

应用程序很可能在刷新stdout缓冲区之前终止

在外部 - 最后(在WriteLine上)添加一个断点,或者从外部添加不同的异常 - 最后确认。 finally 被跳过:这样做会是一个严重的错误!