2014-06-06 23 views
4

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

+1

大卫可能会有答案:)我猜你可以通过在列表使用列表中的第三方单元之前添加你的“catch”单元来钩住某些东西。这一定是可能的,因为像MadExcept和EurekaLog这样的库挂钩了例外。 – Graymatter

回答

3

你不能抓住这样的事情。 RTL执行初始化部分,规则是不会引发异常。如果发生异常,则故障为终端。

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

解决方案是修复代码,使其服从规则。在初始化部分中没有引发异常。


嗯,我想你可以挂钩执行初始化的RTL代码,也许用异常弹性代码替换那个RTL代码。但是,重要的是什么?如果一个初始化部分产生一个异常,唯一可以理解的假设是该单元没有初始化,因此不适合使用。请不要试图将自己的头埋在沙中,而忽略真正的问题。修复第三方代码。

+1

@RezaRahmati我没有想到这最后一部分,但它是非常重要的。当你忽略异常时,你不能保证你的应用程序使用这个库执行的任何代码将按预期运行。这些事情有一种被人遗忘的习惯,当你最不期待的时候,它会非常难以忍受。 – Graymatter

+1

“你不能抓住这样的事情。” - 也许更正确的“你不应该抓这样的事情”,但总的来说,我同意大卫。来自docwiki.embarcadero的注意:在单元的初始化部分引发异常可能不会产生预期的结果。正常的异常支持来自SysUtils单元,必须在这种支持可用之前进行初始化。如果在初始化过程中发生异常,所有初始化的单元(包括SysUtils)都会完成并重新生成异常。然后通常通过中断程序来捕获和处理异常。 –

+0

你甚至不能(只是尝试)挂钩到你自己的UNIT中的Application.OnException(它必须在导致异常的UNIT之前加载) - 可能是因为“所有初始化的单元 - 包括SysUtils - 都已最终确定,异常被重新提出。“ Application.OnException处理程序永远不会被调用。所以看起来,如果没有一些严重的黑客攻击,你不能这样做。也就是说,我同意这里描述的其他观点 - 这种例外(在UNIT的初始化过程中)总是会导致进程终止,因为程序的结果条件是未定义的... – HeartWare

-1

你可以尝试类TApplicationEvents的OnExceptionEvent,但我不确定这是否工作。

+0

当你不确定的时候请参考[documentation](http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TApplication.OnException) :*“OnException仅处理消息处理期间发生的异常。”*。 –