有没有办法捕获并记录应用程序中的所有错误。目前我在我认为可能发生错误的地方使用try catch块。但是有可能捕获应用程序级别的所有错误(我的意思是,我可以将try catch块放到项目文件中,或者其他一些技巧可能会这样做吗?)
答案 0 :(得分:28)
看看MadExcept。如果将它添加到项目中,它会自动安装钩子,捕获所有未处理的异常,生成信息量很大的错误报告,甚至通过电子邮件发送给您或将它们发布到Web服务。实际上能够将调试器连接到客户端系统是下一个最好的事情。
答案 1 :(得分:7)
你也可以考虑Eureka Log,CodeGear自己used for their PHP product。 Eureka Log还具有内存泄漏检测功能,允许您以静默方式通过电子邮件发送崩溃报告,ftp,自动添加到错误跟踪系统,或者允许交互式故障转储提交。
这不是免费的,但我认为很好值钱。老实说,没有它,我无法想象使用Delphi。此外,他们也有该程序的.NET版本。
我喜欢的最后一个功能是,您实际上可以将产品配置为在某些例外情况下采取不同的操作,同时仍能正常捕获其他产品。我将此与一些可以引发的Indy异常一起使用:
答案 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;