未处理的异常和 werfault

Unhandled Exceptions and werfault

假设我们有这段代码:

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

我们有未处理的异常和 finally 块。

werfault 启用并且我在尝试 "automatically solve problem" 时按 Cancel 最终阻止执行。

但是如果我不按 Cancel 并且在下一个 window 单击 Close The Program finally 块不会执行。

最后当我禁用 werfault 并单击 Close Program 最终阻止执行。

我没有在 c# 规范中找到任何描述这种情况的文档。我也在 MSDN:

上找到了这个

Execution of the finally block after an unhandled error depends on how the exception unwind operation is triggered.

但是没有任何解释,任何人都可以描述为什么会这样?

更新 1:我已经在 .Net Framework 4.5.1 和 4.5.2 中进行了测试。

试试这个:

 static void Main(string[] args)
    {
        System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
        try
        {
            throw new Exception("Exception");
        }
        catch
        {
            throw;
        }
        finally
        {
            Console.WriteLine("------finally-----");
        }
    }

    static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine(e.ExceptionObject.ToString());
        Console.WriteLine("Press Enter to continue");
        Console.ReadLine();
        Environment.Exit(1);
    }

我在以下位置找到它:.NET Global exception handler in console application

WerFault.exe 终止 并立即终止 .NET 进程 由于一个未处理的异常,但是当您禁用 WerFault 时,Microsoft .NET 错误报告会以某种方式关闭应用程序,以便 finally 块仍然执行并且不会终止 进程

检查 WerFault.exe 是否立即终止 进程 的最佳方法是 Event Viewer (Description: The process was terminated due to an unhandled exception.).

Application: ConsoleApplication3.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Exception
Stack:
   at ConsoleApplication3.Program.Main(System.String[])

Werfault.exe(Windows 错误报告)被调用用于针对 Framework 4 或更高版本的软件。
它确实像您提到的那样运行.
Dw20.exe (Dr Watson) 在 Framework 3.5 或更低版本中被调用。
它的行为正确(总是调用 finally) .

这些(非 .net)程序的行为不同。它可能来自 Werfault 产生其 minidump(在 finally 之前终止程序)的方式,这显然是有问题的。

正如一些用户已经注意到的,WerFault could be somewhat a "faulty" program

无论如何,对于开发人员而言,我认为向 Microsoft 发送有关您的 "Console 9" 应用程序的数据并不重要。 So you can safely disable the error reporting :

set HKLM/SOFTWARE/Microsoft/Windows/Windows Error Reporting/Disabled to 1

总而言之,如果您对隐私有一些担忧,您不会让 Werfault 以 NSA could use it.

的形式向 Microsoft 发送任何数据