从EurekaLog 6迁移到7时,我注意到编译器警告TEurekaExceptionRecord
已被弃用,我应该使用TEurekaExceptionInfo
。
在我的带有EurekaLog 6的Delphi 7应用程序中,有一个声明如下:
exceptionRecord : TEurekaExceptionRecord;
myString := exceptionRecord.logText;
现在,当我在使用EurekaLog 7的Delphi XE4中使用TEurekaExceptionInfo
而不是TEurekaExceptionRecord
时,如下所示:
exceptionInfo : TEurekaExceptionInfo;
myString := exceptionInfo.logText;
我在第二行收到错误,因为现在logText
不存在。在EurekaLog 7中用哪种方法取代了它?
答案 0 :(得分:2)
我是EurekaLog支持人员。 v6和v7之间存在很大差异。您的问题很难回答,因为虽然您在v6中习惯的全局变量仍保留在v7中,但您可能无法在v7中以相同的方式修改或检查它们。成功取决于何时您读取或修改变量。有几个事件处理程序,每个都在我们的EL类中读/写各种字段。它们是按顺序调用的,所以这就是我提到的计时问题。现在我们在对话框类中创建了日志文本,但是有一些方法可以从它们中提取原始日志文本。
我建议您在我们的网站上打开故障单,并发布一些代码,说明您要执行的操作。您还可以查看我们的代码片段库以获取日志管理的想法。
答案 1 :(得分:0)
通常您不需要访问错误报告:
EurekaLog 7.7.8.2
Application:
-------------------------------------------------------
1.1 Start Date : Wed, 17 Oct 2018 16:23:33 +0300
1.2 Name/Description: Project1.exe
1.3 Version Number :
1.4 Parameters :
1.5 Compilation Date: Wed, 17 Oct 2018 16:23:15 +0300
1.6 Up Time : 6 second(s) Exception:
------------------------------------------------------------------------
2.1 Date : Wed, 17 Oct 2018 16:23:39 +0300
2.2 Address : 012A03F0
2.3 Module Name : Project1.exe
2.4 Module Version:
2.5 Type : ERangeError
2.6 Message : Range check error at Unit1.Button1Click (Line 261)
2.7 ID : ABBB0630
2.8 Count : 1
...
使用上述使用案例之一就足够了。
但是,当您要从EurekaLog 6迁移旧代码时,要访问简单错误报告的一个特定示例是。由于错误报告在异常处理之外不存在,因此从OnExceptionNotify
事件中删除了错误报告。在EurekaLog 7中(不同于EurekaLog 6)。例如,如果您决定不在OnExceptionNotify
事件处理程序中处理异常-那么将根本不会生成错误报告,从而节省了处理时间。
如果您仍然想要EurekaLog 6样式的行为-则可以随时从Dialog.BugReport
属性(基本上是LogBuilder.Report
属性的缓存)中检索错误报告的内容。例如:
uses
EException, // for TEurekaExceptionInfo
ELogBuilder; // for TBaseLogBuilder and RegisterEventEndReportGen
procedure UploadToDB(const ACustom: Pointer;
AExceptionInfo: TEurekaExceptionInfo;
ALogBuilder: TBaseLogBuilder;
var CallNextHandler: Boolean);
var
BugID: Cardinal;
Report: String;
begin
BugID := AExceptionInfo.BugID;
Report := ALogBuilder.Report;
// ... write bug report's content to your DB or
// do whatever you want with it
end;
initialization
RegisterEventEndReportGen(nil, UploadToDB, True);
end.
例如您应将OnExceptionNotify
事件处理程序替换为OnEndReportGen
事件处理程序。该事件处理程序将这样调用:
或者,可以随时(按需)使用BuildBugReport
函数创建错误报告:
uses
EException, // for TEurekaExceptionInfo
ELogBuilder; // for BuildBugReport
var
EI: TEurekaExceptionInfo;
Report: String;
begin
try
// ...
except
on E: Exception do
begin
EI := ExceptionManager.Info(E);
// EI = nil for disabled EurekaLog
// or when exception is ignored
if Assigned(EI) then
begin
Report := BuildBugReport(EI);
// ... write bug report's content to your DB
// or do whatever you want with it
end;
end;
end;