【问题标题】:How to catch exceptions in initialization section of Units in Delphi如何在 Delphi 的 Units 的初始化部分捕获异常
【发布时间】:2014-07-27 11:06:39
【问题描述】:

我有一个第三方单元,女巫在单元的初始化部分引发了异常。如何在我的应用程序中捕获此异常?

【问题讨论】:

  • David 可能会有答案 :) 我猜你可以通过在列表中的第三方单元使用列表之前添加你的“catch”单元来加入一些东西。这一定是可能的,因为像 MadExcept 和 EurekaLog 这样的库会挂钩异常。

标签: delphi exception-handling delphi-xe5 delphi-xe6


【解决方案1】:

你抓不到这样的东西。 RTL 执行初始化部分,规则是不引发异常。如果引发异常,则故障是终端的。

解决这个问题的另一种方法是,当初始化部分开始执行时,语言异常处理框架还没有到位。它本身是作为 RTL 初始化的一部分安装的。

解决方案是修复代码以使其遵守规则。初始化部分没有引发异常。


好吧,我想您可以挂钩执行初始化的 RTL 代码,并可能用异常弹性代码替换该 RTL 代码。但有什么意义呢?如果初始化部分引发异常,唯一合理的假设是该单元未初始化,因此不适合使用。请不要试图把头埋在沙子里而忽略真正的问题。修复第三方代码。

【讨论】:

  • @RezaRahmati 我没有考虑这最后一部分,但它真的很重要。当您忽略异常时,您无法保证使用此库的应用程序执行的任何代码都将按预期运行。这类事情有一种被遗忘的习惯,并且在你最意想不到的时候会非常努力地坚持下去。
  • “你抓不到这样的东西。” - 也许更正确的“你不应该抓住这样的东西”,但总的来说我同意大卫的观点。来自 docwiki.embarcadero 的注释:在单元的初始化部分引发异常可能不会产生预期的结果。正常的异常支持来自 SysUtils 单元,必须在提供此类支持之前对其进行初始化。如果在初始化期间发生异常,则所有已初始化的单元(包括 SysUtils)都将完成并重新引发异常。然后异常被捕获和处理,通常是通过中断程序。
  • 您甚至不能(刚刚尝试)在您自己的一个 UNIT 中挂钩 Application.OnException(必须在导致异常的 UNIT 之前加载) - 可能是因为“所有已初始化的单元 - 包括SysUtils - 已完成并重新引发异常。”。 Application.OnException 处理程序永远不会被调用。所以看起来,如果没有一些严重的黑客攻击,你就无法做到。话虽如此,我同意这里描述的其他观点 - 这种异常(在 UNIT 的初始化中)应该总是导致进程终止,因为程序的结果条件是未定义的......
  • @HeartWare 只有将InitUnits 钩入System 才能做到这一点。代码挂钩可以完成工作。不是一个好主意。
  • 修复此第三方库的代码,使其不会在其初始化代码中引发异常
【解决方案2】:

您可以尝试 TApplicationEvents 类的 OnExceptionEvent,但我不确定这是否有效。

【讨论】:

  • 不确定时请参考documentation“OnException 只处理消息处理过程中发生的异常。”.
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多