我有一个第三方单元,在单元的初始化部分引发异常。我如何在我的应用程序中捕获这个异常?如何在Delphi的单元的初始化部分捕捉异常
回答
你不能抓住这样的事情。 RTL执行初始化部分,规则是不会引发异常。如果发生异常,则故障为终端。
另一种解决方法是当初始化部分开始执行时,语言异常处理框架还没有到位。本身作为RTL初始化的一部分进行安装。
解决方案是修复代码,使其服从规则。在初始化部分中没有引发异常。
嗯,我想你可以挂钩执行初始化的RTL代码,也许用异常弹性代码替换那个RTL代码。但是,重要的是什么?如果一个初始化部分产生一个异常,唯一可以理解的假设是该单元没有初始化,因此不适合使用。请不要试图将自己的头埋在沙中,而忽略真正的问题。修复第三方代码。
@RezaRahmati我没有想到这最后一部分,但它是非常重要的。当你忽略异常时,你不能保证你的应用程序使用这个库执行的任何代码将按预期运行。这些事情有一种被人遗忘的习惯,当你最不期待的时候,它会非常难以忍受。 – Graymatter
“你不能抓住这样的事情。” - 也许更正确的“你不应该抓这样的事情”,但总的来说,我同意大卫。来自docwiki.embarcadero的注意:在单元的初始化部分引发异常可能不会产生预期的结果。正常的异常支持来自SysUtils单元,必须在这种支持可用之前进行初始化。如果在初始化过程中发生异常,所有初始化的单元(包括SysUtils)都会完成并重新生成异常。然后通常通过中断程序来捕获和处理异常。 –
你甚至不能(只是尝试)挂钩到你自己的UNIT中的Application.OnException(它必须在导致异常的UNIT之前加载) - 可能是因为“所有初始化的单元 - 包括SysUtils - 都已最终确定,异常被重新提出。“ Application.OnException处理程序永远不会被调用。所以看起来,如果没有一些严重的黑客攻击,你不能这样做。也就是说,我同意这里描述的其他观点 - 这种例外(在UNIT的初始化过程中)总是会导致进程终止,因为程序的结果条件是未定义的... – HeartWare
你可以尝试类TApplicationEvents的OnExceptionEvent,但我不确定这是否工作。
当你不确定的时候请参考[documentation](http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TApplication.OnException) :*“OnException仅处理消息处理期间发生的异常。”*。 –
- 1. 如何捕捉异常在静态初始化块抛出
- 2. Java:变量的捕捉异常可能没有被初始化
- 3. 如何捕捉抛出的异常,同时初始化静态成员
- 4. 如何捕捉内部异常?
- 5. 如何捕捉内部异常
- 6. 如何捕捉“未捕获的异常”?
- 7. 使用初始化内部的异常
- 8. 如何捕捉devenv异常
- 9. 如何捕捉“FileNotFoundException”异常?
- 10. 如何捕获初始化列表中的异常?
- 11. 捕捉异常
- 12. 初学C++ - 尝试捕捉异常
- 13. 尝试捕捉对象初始化
- 14. 如何捕捉eventmachine中的异常
- 15. 如何捕捉“使用mypackage”的异常?
- 16. 如何捕捉C#中的Lua异常#
- 17. 如何处理捕捉到的异常
- 18. 如何捕捉C#中的FtpWebResponse异常
- 19. 如何捕捉WeldListener中的isHexDigit异常?
- 20. 如何捕捉MVC视图的异常?
- 21. 如何捕捉线程中的异常
- 22. 如何在java中捕捉异常抛出的异常?
- 23. 如何捕捉SQL异常在Laravel 5
- 24. 如何在iOS中捕捉iCloud异常?
- 25. 如何在Java中捕捉异常?
- 26. 如何在`Yesod Handler'中捕捉异常?
- 27. 如何在Qt中捕捉异常?
- 28. 捕捉filenotfound异常
- 29. 捕捉异常C#
- 30. 捕捉Javamail异常
大卫可能会有答案:)我猜你可以通过在列表使用列表中的第三方单元之前添加你的“catch”单元来钩住某些东西。这一定是可能的,因为像MadExcept和EurekaLog这样的库挂钩了例外。 – Graymatter