9

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

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

4

3 回答 3

5

如果这是 WinForms,您必须处理AppDomain.UnhandledExceptionApplication.ThreadException才能捕获它们。一些例外过滤到一个和其他过滤到另一个。

这里有一个类似(但不完全重复)的问题应该有所帮助:C# - WinForms - 事件的异常处理

于 2012-07-04T20:51:59.903 回答
1

Windows Forms 有一个内置的异常处理程序,默认情况下在没有附加调试器时捕获未处理的托管异常,并且在窗口消息处理期间发生异常,并且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

于 2012-07-04T20:51:16.007 回答
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();
        }
    }
于 2012-07-04T20:45:15.850 回答