【问题标题】:How can I override the default uncaught exception dialog?如何覆盖默认的未捕获异常对话框?
【发布时间】:2012-07-05 07:35:19
【问题描述】:

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

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

【问题讨论】:

  • 这是 JIT 的一个特性。我不确定有没有办法修改它...
  • 我可能会创建一个生产模式/开发模式配置变量,以在顶层查看您自己的对话框(和捕获)和不查看它之间切换。一般来说,这也是调试的好主意...
  • 绝对有可能,我记得红门在这个领域做过一些事情。请参阅此image 和相关产品page。我不确定他们是否有免费版本,但他们已经这样做了,所以一定有办法!

标签: c# winforms exception-handling


【解决方案1】:

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

【讨论】:

  • 我不确定这如何让我显示自定义消息。
【解决方案2】:

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

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

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

在 Visual Studio 中,转到 Tools > Options > Debugging > JIT 将此键设置为 0 或 2。但值 1 通常是您在最终用户计算机上想要的值 p>

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-18
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 2015-12-29
      • 2017-07-22
      • 2015-04-25
      • 2017-05-02
      • 1970-01-01
      相关资源
      最近更新 更多