未处理的异常和错误

时间:2015-09-29 07:42:50

标签: c# exception-handling windows-error-reporting

考虑一下我们有这段代码:

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

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

启用werfault时,我会在Cancel尝试自动解决问题" finally块执行。

但如果我没有按Cancel,请在下一个窗口中点击Close The Program ,最后屏蔽不会执行。

最后,当我停用werfault并点击Close Program 时,最后阻止执行。

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

  

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

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

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

3 个答案:

答案 0 :(得分:1)

由于未处理的异常,

WerFault.exe 终止 并立即终止.NET 进程但禁用{{1} Microsoft .NET错误报告以某种方式关闭应用程序,以便仍然执行WerFault块并且不终止进程

检查finally立即终止进程的最佳方式是Event ViewerWerFault.exe)。

Description: The process was terminated due to an unhandled exception.

答案 1 :(得分:1)

针对框架4或更高版本的软件调用

Werfault.exe (Windows错误报告)。
它的行为如您所述。
为框架3.5或更低版本调用 Dw20.exe (Dr。Watson)。
它的行为正确(总是最后调用)。

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

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

无论如何,对于开发人员,我不认为向Microsoft发送有关您的"控制台9"申请是相关的。 So you can safely disable the error reporting

  

设置HKLM / SOFTWARE / Microsoft / Windows / Windows错误报告/已禁用   到1

作为结论,如果您对隐私有一些担忧,您不会让Werfault将任何数据发送给Microsoft NSA could use it.

答案 2 :(得分:-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 Global exception handler in console application