如何覆盖默认的未捕获异常对话框?

时间:2012-07-04 20:33:05

标签: c# winforms exception-handling

如果在.NET应用程序中未捕获异常,则虚拟机会向用户显示错误消息。我希望能够显示我自己的错误消息,而不必在我的应用程序的顶层放置catch块(因为这会使调试未捕获的异常更加繁琐)。

现在我在AppDomain.UnhandledException事件监听器中显示自己的错误对话框,但仍然会显示.NET创建的对话框。我还想避免使用Environment.FailFast,因为这会绕过我的finally块(我仍然有点依附)。

3 个答案:

答案 0 :(得分:5)

如果这是WinForms,则必须处理AppDomain.UnhandledExceptionApplication.ThreadException才能捕获所有内容。一些例外过滤到另一个例外,其他例外过滤到另一个例外。

这里有类似(但不完全相同)的问题应该有所帮助:C# - WinForms - Exception Handling for Events

答案 1 :(得分:1)

Windows窗体有一个内置的异常处理程序,默认情况下在没有连接调试器时捕获未处理的托管异常,并且在窗口消息处理期间发生异常,并且App.Config中的 jitDebugging = false 。然后,它会向最终用户显示一个对话框,并阻止应用终止。

您可以在 HKLM \ Software \ Microsoft \ .NetFramework 下更改注册表设置 DbgJitDebugLaunchSetting 。这是我所知道的三个值中的一个:

  • 0:显示用户对话框询问“调试或终止”。
  • 1:让CLR处理异常。
  • 2:启动 DbgManagedDebugger 注册表项中指定的调试器。

在Visual Studio中,转到工具>选项>调试> JIT 将此键设置为0或2.但值1通常是您在最终用户的计算机上所需的值

(见http://msdn.microsoft.com/en-us/library/2ac5yxx6(v=vs.90).aspx

答案 2 :(得分:0)

WP7中的类似模式怎么样?

    // Code to execute on Unhandled Exceptions
    private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
    {
        // do stuff
        if (System.Diagnostics.Debugger.IsAttached)
        {
            // An unhandled exception has occurred; break into the debugger
            System.Diagnostics.Debugger.Break();
        }
    }
相关问题