1

在从 EurekaLog 6 迁移到 7 时,我注意到一个编译器警告已TEurekaExceptionRecord被弃用,我应该使用TEurekaExceptionInfo.

在我的带有 EurekaLog 6 的 Delphi 7 应用程序中,有如下语句:

exceptionRecord : TEurekaExceptionRecord; 
myString := exceptionRecord.logText;

现在,当我使用EurekaLog 7TEurekaExceptionInfo代替TEurekaExceptionRecordDelphi XE4 时,如下所示:

exceptionInfo : TEurekaExceptionInfo;
myString := exceptionInfo.logText;

我在第二行收到错误,因为logText现在不存在。哪种方法在 EurekaLog 7 中取代了它?

4

2 回答 2

2

我是 EurekaLog 支持人员。v6 和 v7 之间存在很大差异。您的问题很难回答,因为虽然您在 v6 中习惯的全局变量仍保留在 v7 中,但您可能无法在 v7 中以相同的方式修改或检查它们。成功取决于您何时读取或修改变量。有几个事件处理程序,每个处理程序读取/写入我们 EL 类中的各种字段。它们是按顺序调用的,所以这就是我提到的时间问题出现的地方。日志文本现在在我们的对话框类中创建,但是有一些方法可以从中提取原始日志文本。

我建议您在我们的网站上打开故障单并发布一些代码来演示您正在尝试做什么。您还可以查看我们的代码片段库以了解日志管理的想法。

于 2013-09-29T21:26:55.490 回答
0
  1. 如果您正在寻找获取一般异常信息(类、消息、地址等) - 请参阅如何获取异常信息?
  2. 如果您正在寻找获取异常的调用堆栈 - 请参阅如何获取异常的调用堆栈?
  3. 如果您正在寻找将报告文件保存到数据库或网络共享中(带有屏幕截图、附件、网页、转储等) - 请参阅如何保存报告而不是发送?
  4. 如果您想对错误报告文件进行操作 - 请参阅如何获取错误报告的文件名?

通常您不需要访问错误报告:

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程序。这个事件处理程序将像这样调用:

  • 上传到数据库
  • TBaseDialog.SaveBugReport
  • TBaseDialog.Execute
  • 显示异常
  • 进程异常
  • 异常管理器.句柄
  • Forms.TApplication.HandleException

或者,可以随时(按需)创建错误报告 - 通过使用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;
于 2019-06-11T12:16:25.240 回答