有没有办法捕获未处理的应用程序异常并记录它们

时间:2011-02-17 18:45:42

标签: delphi error-handling

有没有办法捕获并记录应用程序中的所有错误。目前我在我认为可能发生错误的地方使用try catch块。但是有可能捕获应用程序级别的所有错误(我的意思是,我可以将try catch块放到项目文件中,或者其他一些技巧可能会这样做吗?)

5 个答案:

答案 0 :(得分:28)

看看MadExcept。如果将它添加到项目中,它会自动安装钩子,捕获所有未处理的异常,生成信息量很大的错误报告,甚至通过电子邮件发送给您或将它们发布到Web服务。实际上能够将调试器连接到客户端系统是下一个最好的事情。

答案 1 :(得分:7)

你也可以考虑Eureka Log,CodeGear自己used for their PHP product。 Eureka Log还具有内存泄漏检测功能,允许您以静默方式通过电子邮件发送崩溃报告,ftp,自动添加到错误跟踪系统,或者允许交互式故障转储提交。

enter image description here

这不是免费的,但我认为很好值钱。老实说,没有它,我无法想象使用Delphi。此外,他们也有该程序的.NET版本。

我喜欢的最后一个功能是,您实际上可以将产品配置为在某些例外情况下采取不同的操作,同时仍能正常捕获其他产品。我将此与一些可以引发的Indy异常一起使用:

enter image description here

答案 2 :(得分:2)

“捕捉”异常可能意味着许多事情:记录,显示,行动,重新加载,或上述任意组合。 TApplication OnException处理程序将“捕获”所有未处理的主线程异常,但不会捕获线程中引发的异常。为此,您需要实现自己的线程异常处理。在我的应用程序框架(http://www.csinnovations.com/framework_overview.htm)中,我的代码将确保可以记录任何异常(所有未处理的异常以及可选的任何处理的异常),并且如果它在主线程中,则可选地显示,无论它是否发生在主线程或任何其他线程中。虽然它不像MadExcept那么全面,但它具有处理异常所需的所有功能。

答案 3 :(得分:2)

如果要拦截所有异常并记录它们,则需要实现RTLUnwindProc低级别过程。

这有点低级(例如它需要asm技能),因此您最好依赖现有代码。见this stack overflow question

我甚至在my own answer中添加了一些参考代码(包括低级asm,在Win32下使用Delphi 7和更高版本),其中显示了logging features included in our Open Source mORMot framework。要记录所有异常,只需添加对SynCommons.pas的引用,并在程序启动时添加以下行:

TSynLog.Family.Level := [sllException,sllExceptionOS];

目前,从Delphi 5到XE4,适用于Win32和Win64平台。

答案 4 :(得分:-1)

像这样使用try..except块:

try
..
// a critical section here
..
except on E:exception do
begin
  showmessage('an error occured: ' + E.message);
  //do something else
end
end;