不幸的是,我没有从我的开发PC中写这个问题所以我可能会犯一些错误。请抱歉... 那么 - 我的问题 - 您使用什么方法在应用程序中实现错误记录?
在web(http://delphi.about.com)中是很好的事件处理程序,但它只是复制文件中的系统错误,但我想通过捕获内存和堆栈(以及处理器信息,如果我有时间)来扩展其功能。我是否应该知道我是否动态调用它,而不是在表单上添加其组件?
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception) ;
var
ErrorLogFileName : string;
ErrorFile : TextFile;
ErrorData : string;
begin
ErrorLogFileName := ChangeFileExt(Application.ExeName,'.error.log') ;
AssignFile(ErrorFile, ErrorLogFileName) ;
//either create an error log file, or append to an existing one
if FileExists(ErrorLogFileName) then
Append(ErrorFile)
else
Rewrite(ErrorFile) ;
try
//add the current date/time and the exception message to the log
ErrorData := Format('%s : %s',[DateTimeToStr(Now),E.Message]) ;
WriteLn(ErrorFile,ErrorData) ;
finally
CloseFile(ErrorFile)
end;
//Show the exception
Application.ShowException(E) ;
end;
...和http://delphi.about.com/cs/adptips2001/a/bltip0101_2.htm
众所周知,Delphi还提供类似C的内存管理 - 使用&符号和Pascal函数,但最有效的日志记录是什么?
先谢谢!希望这个主题对其他高质量的程序员有用。
答案 0 :(得分:6)
可能值得一看第三方组件,而不是自己写一些东西。 EurekaLog和madExcept都完全符合您的要求。两者都提供了很好的输出,并且支持连接到FogBugz,Mantis和BugZilla等错误跟踪系统。有了它,你可以实际整理你得到的错误报告,发现常见的模式,并希望更快地修复错误。
就个人而言,安装Jedi JVCL / JCL对于它的异常跟踪来说有点过分,因为它是一个非常大的安装。我提到的上述两种都是商业产品,但你可以得到你付出的代价。
答案 1 :(得分:3)
IIUC,你想要一个包含行号,系统信息等的堆栈跟踪报告。如下所示:
Exception class: EVariantTypeCastError
Exception address: 004170ED
------------------------------------------------------------------------------
Stack list, generated 12/7/2009 11:32:19
[004170E8]{A.exe } Variants.HandleConversionException (Line 614, "sys\variants.pas" + 10)
[0057ACAC]{A.exe } cxDataStorage.TcxSmallintValueType.SetDataValue (Line 1067, "cxDataStorage.pas" + 2)
[005AC6C5]{A.exe } cxCustomData.TcxCustomDataController.SetStoredValue (Line 12752, "cxCustomData.pas" + 2)
[005A8AD3]{A.exe } cxCustomData.TcxCustomDataController.SetValue (Line 10401, "cxCustomData.pas" + 12)
[0059DA0B]{A.exe } cxCustomData.TcxCustomDataProvider.SetEditValue (Line 3180, "cxCustomData.pas" + 4)
[005A8F9B]{A.exe } cxCustomData.TcxCustomDataController.SetEditValue (Line 10560, "cxCustomData.pas" + 2)
[0066EBBE]{A.exe } cxGridCustomTableView.TcxCustomGridTableItem.SetEditValue (Line 14396, "cxGridCustomTableView.pas" + 1)
[006637C5]{A.exe } cxGridCustomTableView.TcxGridEditingController.UpdateValue (Line 7474, "cxGridCustomTableView.pas" + 4)
[00673F30]{A.exe } cxGridCustomTableView.TcxCustomGridTableView.UpdateRecord (Line 17771, "cxGridCustomTableView.pas" + 1)
[0059D97F]{A.exe } cxCustomData.TcxCustomDataProvider.PostEditingData (Line 3170, "cxCustomData.pas" + 1)
[00A80870]{A.exe } fFilterLine.TFilterLine.UMLayoutChanged (Line 1034, "fFilterLine.pas" + 0)
[00482DBF]{A.exe } Controls.TWinControl.WndProc (Line 7304, "Controls.pas" + 111)
[004824E8]{A.exe } Controls.TWinControl.MainWndProc (Line 7073, "Controls.pas" + 3)
[00431D84]{A.exe } Classes.StdWndProc (Line 11583, "common\Classes.pas" + 8)
[0049F981]{A.exe } Forms.TApplication.MessageBox (Line 8293, "Forms.pas" + 22)
[0049FA99]{A.exe } Forms.TApplication.ShowException (Line 8312, "Forms.pas" + 3)
[00A7D7B1]{A.exe } ExceptionDlg.TfrmException.ExceptionHandler (Line 428, "..\Shared\ExceptionDlg.pas" + 2)
...
<snipped>
...
------------------------------------------------------------------------------
System : Windows XP Professional, Version: 5.1, Build: A28, "Service Pack 2"
Processor: Intel, Intel(R) Core(TM)2 Quad CPU Q6700 @ 2.66GHz, 2666 MHz MMX 64 bits
Memory: 1043; free 196
Display : 1920X1200 pixels, 32 bpp
------------------------------------------------------------------------------
Active Controls hierarchy:
TcxCustomInnerTextEdit ""
TcxTextEdit ""
TcxGridSite ""
TcxGrid "cxgHeader"
TPanel "pnlMain"
TTabSheet "tshAccMov"
TPageControl "pcoMov"
TfrmMain "frmMain"
------------------------------------------------------------------------------
......好吧,imho,不值得重新发明轮子。 这已经完成,它是免费的。下载(如果您还没有)JEDI的JVCL+JCL from SourceForge并安装它们。在文件中|新的|其他| Delphi文件...... 你将有一个新项目:'Delphi的Jcl Exception对话框'。
而且(imho)这比你能做的更成熟/更先进'如果你有时间'。您还可以自定义生成的异常处理程序以满足您的需要。还有一个支持新闻组。顺便说一句,IIRC,你只需要JCL用于对话,但我不确定。此外,您还有商业选项(madExcept,EurekaLog等),但这些只是高级错误记录器,而JVCL除了免费之外,还将为您提供超过600个组件。
HTH