【问题标题】:What errors / exceptions trigger Windows Error Reporting?哪些错误/异常会触发 Windows 错误报告?
【发布时间】:2009-10-07 07:58:27
【问题描述】:

在调试器之外运行 Delphi 应用程序时,发生的大多数异常似乎都被默默忽略(如访问冲突)。但是有时会出现 Windows 错误报告对话框(发送或不发送,您可能知道我的意思)。这到底是什么意思?哪些错误会触发此行为?

附加信息:我的应用程序有一个全局异常处理程序,它应该记录所有未处理的异常。因此,任何异常都不应该让应用程序处于未处理状态。

谢谢。

【问题讨论】:

    标签: windows delphi exception-handling delphi-2009


    【解决方案1】:

    大多数异常在调试器之外运行时不会被静默忽略。它们通常被 VCL 应用程序中的事件循环捕获,或者在控制台应用程序中落入主开始/结束等。VCL 事件循环的默认动作是显示一个包含与异常相关的消息的对话框。

    如果异常逃脱了应用程序,无论是通过到达主开始/结束而没有被捕获,或者没有被事件循环捕获,Windows 错误报告就会介入 - 从功能上讲,它是一个异常处理程序,就像任何除了在堆栈的最底部之外。

    【讨论】:

    • 谢谢!请注意,我有一个全局异常处理程序,它应该捕获未处理的异常(这就是我所说的“默默地忽略”)。无论如何,有时 Windows 错误报告会介入,我想知道为什么......
    • 因为未处理的异常发生在应用程序启动期间全局处理程序到位之前,或者在应用程序关闭期间全局处理程序断开连接之后。
    • @Ken:不,绝对不是。它发生在应用程序运行时(几分钟后)。并且应用程序只有在关闭错误报告对话框后才会关闭。
    【解决方案2】:

    它涵盖了应用程序未处理的异常 - 如果异常传播到应用程序的主入口点之外,则 WER 将介入。这包括诸如 AV、除以零、无效句柄访问和其他输出带或“芯片”例外。有时你的代码可以尝试处理这些事情,但如果内存损坏太严重或者你有什么,那么你的代码就会死掉。

    【讨论】:

      【解决方案3】:

      如果您在Execute 方法中未处理的线程中有异常,您通常会遇到问题。该程序大部分会被杀死,但行为是不可预测的,并且似乎取决于很多事情(比如其他线程的数量和状态)。通常主窗口会立即消失,因此程序不会处理任何进一步的异常,这可能是导致 WER 捕获它们的原因。

      我养成了在Execute 中有一个外部异常处理程序的习惯,它记录任何未处理的异常并允许线程干净地终止。

      【讨论】:

        【解决方案4】:

        在初始化和终结部分发生的异常会逃逸您的全局异常处理程序并触发 WER。

        【讨论】:

          猜你喜欢
          • 2015-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多