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

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

这就是我们所做的。

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); } 

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

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

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

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

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

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

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

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

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

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

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

这是关于该方法的MSDN文档

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

那个提示是DrWatson天的forms..可能会也可能不会奏效。