防止“向Microsoft发送错误报告”

时间:2009-01-23 15:45:41

标签: c# error-handling

我正在开展一个相当大的项目,它不太可能抓住一切。我发现事件通知我未处理的异常,但我还没有找到一种方法以编程方式关闭Windows错误对话框。理想情况下,如果存在未处理的异常,我希望触发该事件,提供一个对话框告诉用户存在问题,然后优雅地关闭。有没有办法做到这一点?我意识到我可以在try catch中包裹最高层,但我希望能有更优雅的东西。

6 个答案:

答案 0 :(得分:5)

这就是我们所做的。

static void Main() {
    try
    {
        SubMain();
    }
    catch (Exception e)
    {
        HandleUnhandledException(e);
    }
}

private static void SubMain()
{
    // Setup unhandled exception handlers
    AppDomain.CurrentDomain.UnhandledException += // CLR
       new UnhandledExceptionEventHandler(OnUnhandledException);
     Application.ThreadException += // Windows Forms
       new System.Threading.ThreadExceptionEventHandler(
           OnGuiUnhandledException);
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new frmMain());
}

// CLR unhandled exception
private static void OnUnhandledException(Object sender,
   UnhandledExceptionEventArgs e)
{
    HandleUnhandledException(e.ExceptionObject);
}

// Windows Forms unhandled exception
private static void OnGuiUnhandledException(Object sender,
   System.Threading.ThreadExceptionEventArgs e)
{
    HandleUnhandledException(e.Exception);
}

答案 1 :(得分:3)

你回答了自己的问题。防止错误对话框的最佳方法是编写处理异常的代码,以便永远不会出现对话框。我会打赌这是雷蒙德·陈所建议的(如果我可能如此大胆)。

答案 2 :(得分:1)

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

虽然如果您将此作为商业项目发布,我建议您向Microsoft注册,以便您可以实际获取正在发送给MS的崩溃转储和错误报告信息

答案 3 :(得分:1)

如果您使用的是.NET Framework 2.0或更高版本,并且工作线程中存在未处理的异常,我相信您运气不好。在.NET 1.0和1.1中,CLR只是从主线程以外的线程中吞下了异常。但是,这在.NET 2.0中已更改,其中线程上的未处理异常导致应用程序关闭。

您可以订阅AppDomain.CurrentDomain.UnhandledException,以便在出现这些类型的未处理异常时收到通知,但此时应用程序很可能会关闭,并且您只是有机会在不可避免的情况下执行操作,例如记录例外某处并显示用户友好的消息。 UnhandledExceptionEventArgs有一个名为IsTerminating的只读属性,您可以检查该应用程序是否正在终止。应用程序终止后,通常会弹出Microsoft错误报告对话框。

虽然我不建议这样做,但有一种方法可以通过在app配置文件中设置应用程序兼容性标志来恢复CLR 1.0和1.1的行为。

这不应导致应用程序在未处理的异常情况下终止,并降低获取该错误报告对话框的可能性。

我的建议是只捕获您预期并能够在代码中处理的异常,并让其他代码冒出来。

答案 4 :(得分:0)

如果您的问题与WinForms应用程序有关,那么所选答案对您有用,但它并不完全优雅。

.NET为这个确切的场景提供了一个助手:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException

And here's the MSDN Documentation on the method

答案 5 :(得分:-2)

您可以尝试使用HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug

那个提示是DrWatson天的形式..可能会也可能不会起作用。