【问题标题】:How to suppress all .NET exception dialog boxes?如何抑制所有 .NET 异常对话框?
【发布时间】:2012-11-10 09:50:50
【问题描述】:

根据我的经验,.NET 应用程序中的unhandled exception 会导致显示一个对话框,描述异常等。

  1. 有没有办法完全禁止此类对话框?
  2. 是否可以仅针对Background Thread 隐藏对话框?

【问题讨论】:

  • SetErrorMode 可能会有所帮助,尽管它不是特定于 .NET 的。
  • 唯一好的答案是捕获并正确处理所有异常。但是,AppDomain 有一个事件处理程序可用于查找未处理的异常
  • 该对话框由 Windows 错误报告组件 WER 显示。可以针对特定程序有选择地关闭它,请在 superuser.com 上询问。先搜索。
  • @HansPassant:很明显,如果我在这里提出问题,我正在尝试以编程方式执行此操作,因此该问题不适合超级用户。

标签: .net unhandled-exception background-thread


【解决方案1】:

是的,这是可能的,但您必须认真考虑这对您的应用程序意味着什么。

如果发生 unhandled 异常,您的应用程序可能处于意外/未定义状态,让应用程序崩溃可能更有意义 - 替代方案可能是不一致或冻结 UI,甚至更糟。

话虽如此,您并没有说明您使用的是 WPF、WinForms、控制台应用程序还是 ASP .NET 或其他东西。您需要告诉我们您正在使用的技术;但总的来说,您应该能够连接一个全局异常处理程序,它只是抑制异常。

对于后台线程部分,您可以简单地将线程函数包装在 try catch 块中。

【讨论】:

    【解决方案2】:

    未处理的异常实际上会终止您的进程。如何呈现给用户取决于 Windows。例如,如果您安装了调试器,您会看到一个对话框,允许您调试进程。这不是您在应用程序中控制的东西。

    但是,如果您的应用程序是 Windows 窗体应用程序,.NET 框架将为未处理的异常设置一个处理程序,该处理程序将打开一个对话框,其中包含有关异常的一些信息,然后允许您的进程继续。我假设这就是您所指的对话框。

    要避免这种行为,最好的方法是使用 try-catch 块来实际捕获和处理异常。当然,捕获然后完全忽略异常通常是一个坏主意,并且可能会隐藏应用程序中的错误。

    您可以自定义 Windows 窗体如何使用 Application.SetUnhandledExceptionMode 方法处理您自己没有发现的异常。

    【讨论】:

      【解决方案3】:

      偶然发现了这个问题,因为我有一些自动化测试被我想禁止的异常对话框阻止。这个问题的标题优于任何类似的stackoverflow问题,所以谷歌把我发到这里。但是,问题主体和答案更倾向于程序化方法。

      鉴于帖子标题,在不修改源代码的情况下提供解决问题的答案似乎是合理的。

      最终我能够通过将注册表中的DontShowUI 键设置为1 来抑制异常对话框。此修复程序以及一系列替代方案在以下位置进行了详细描述:

      https://stackoverflow.com/a/3637710/195755

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-20
        • 2011-04-19
        • 1970-01-01
        • 2019-12-03
        • 2010-11-01
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多