为什么最终没有被执行?

时间:2013-01-10 16:35:14

标签: c# .net exception try-catch try-finally

我的假设是,只要程序正在运行,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

注意:当抛出异常时,Windows询问我是否要结束应用程序,我说'是'。

5 个答案:

答案 0 :(得分:6)

它实际执行了。只是你没有注意到。就在您看到Windows is checking for a solution to the problem时,点击取消并查看。

enter image description here

答案 1 :(得分:3)

您可能正在调试,当您单击否时,调试器将暂停执行。

答案 2 :(得分:2)

从命令行运行时。就在Windows尝试正常结束应用程序时,如果应用程序没有响应,请单击nocancelenter image description here

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

始终给出输出“finally”

答案 4 :(得分:-2)

异常在堆栈中冒泡,直到找到处理程序。如果没有,程序退出。在您的场景中就是这种情况......没有处理程序,所以程序在它到达finally块之前退出。