【问题标题】:Windows Forms Unhandled-Exception DialogWindows 窗体未处理异常对话框
【发布时间】:2010-04-13 12:05:01
【问题描述】:

每当我的 C# 应用程序遇到 U-E 时,我都想获得默认 Windows 窗体未处理异常对话框。 在 vs 2005 中,当我像这样在 app.conf 中关闭 jit 调试时:

<configuration>
   <system.windows.forms jitDebugging="false" />
<configuration>

应用程序运行正常并显示 Windows 窗体 U-E 默认对话框,包括继续、退出、调用堆栈等。

但是在 vs 2008 中,在同一台机器上或不同机器上,即使我禁用 jit,我仍然会得到默认的 .NET 未处理异常对话框,带有调试、发送报告和不发送按钮。

如何使我的 vs 2008 应用程序像我在 vs 2005 中制作的一样,以显示 Windows Forms U-E 对话框?

请不要推荐使用

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

仅仅因为我没有在我的 vs 2005 项目中使用自定义处理程序,我为什么要在 vs 2008 中使用?我想让这个工作做 CLR。​​

感谢任何帮助

【问题讨论】:

    标签: c# exception unhandled


    【解决方案1】:

    您正在谈论不同的异常处理功能。您看到的带有退出和继续按钮的ThreadExceptionDialog 是由Application.ThreadException event 触发的。只有当异常发生在 UI 线程上时,它才会出现,当响应 Windows 消息而运行的事件处理程序抛出异常时。但是,工作线程中的任何异常都会通过 AppDomain.UnhandledException 轰炸程序。

    您无法处理后者,程序已死并且无法继续。显示 ThreadExceptionDialog 毫无意义。

    您可以通过调用 Application.SetUnhandledExceptionMode() 来禁用 ThreadException 事件,从而使程序始终炸弹。现在每个未处理的异常都会触发 AppDomain.UnhandledException 并终止程序。这可能不是您想要的,但却是明智的选择。

    另请注意,当您使用调试器运行程序时,ThreadException 事件被禁用。这大概就是您在 VS2008 中看到差异的原因。否则没有任何变化。

    【讨论】:

    • 好吧,我的应用程序中只有 UI 线程。基本上,例如,我刚刚从头开始创建了新的示例应用程序,并在表单构造函数中仅添加了 nullreferenceexception。我试图玩 Application.SetUnhandledExceptionMode() 没有任何区别。更重要的一点是,我不是在带调试器的机器上测试,而是在现场 pc 上测试,没有这样的。我的理解是VS2008添加了一些透明的线程机制,让我看不到我想看的东西。
    • 表单构造函数中的异常会通过 AppDomain.UnhandledException 轰炸,消息循环还没有开始。 VS2008 或 .NET 3.5 没有添加任何透明的东西。不确定您想看到什么,但在 AppDomain.UnhandledException 事件处理程序中记录异常对于找出问题所在很重要。你真的必须做你不想被推荐的事情。
    • 你是对的 Hans,从构造函数抛出的错误是非 UI(UnhandledException),而从 ui 中的任何地方抛出的错误是主 UI 线程类型(ThreadException)。因此,对于 ThreadException,我设法获得了 ThreadExceptionDialog。你的回答很有帮助,可惜我现在不能投票!
    • @Hans Passant:ThreadException 未被禁用。我在 VS2008 中使用“调试”。可以提供参考吗?
    • @AMiss - 6 个月后没有跟进,不是真的。请在您自己的问题中记录您的问题。
    【解决方案2】:

    Answer by Hans Passant 似乎很明智。但是,即使您说您不想这样做,我仍然推荐 a handler on AppDomain.CurrentDomain.UnhandledException 以确保您确定应用程序意外崩溃时会发生什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      相关资源
      最近更新 更多