7

考虑我们有这段代码:

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

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

何时启用werfault并且我Cancel在尝试“自动解决问题”时按下最终块执行。

但是,如果我没有按下Cancel并且在下一个窗口中单击Close The Program finally 块不会执行。

最后,当我禁用werfault并单击Close Program finally 块执行时。

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

在未处理的错误之后执行 finally 块取决于异常展开操作的触发方式。

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

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

4

3 回答 3

1

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

这些(非.net)程序的行为是不同的。这可能来自于 Werfault 生成其 minidump 的方式(最终杀死程序),这显然是错误的。

正如一些用户已经注意到的那样,WerFault 可能在某种程度上是一个“有缺陷的”程序

无论如何,对于开发人员来说,我认为向 Microsoft 发送有关您的“Console 9”应用程序的数据并不重要。因此,您可以安全地禁用错误报告

将 HKLM/SOFTWARE/Microsoft/Windows/Windows 错误报告/禁用设置为 1

作为结论,如果您对隐私有一些担忧,您不会让 Werfault 向 Microsoft 发送任何数据,因为NSA 可以使用它。

于 2015-10-02T04:29:32.860 回答
1

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[])
于 2015-10-01T20:02:14.660 回答
-1

尝试这个:

 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 全局异常处理程序

于 2015-09-29T07:48:36.123 回答