现在在EurekaLog 7中不推荐使用TEurekaExceptionRecord,是什么取代了LogText?

时间:2013-09-23 09:40:32

标签: delphi delphi-7 delphi-xe4 eurekalog

从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中用哪种方法取代了它?

2 个答案:

答案 0 :(得分:2)

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

我建议您在我们的网站上打开故障单,并发布一些代码,说明您要执行的操作。您还可以查看我们的代码片段库以获取日志管理的想法。

答案 1 :(得分:0)

  1. 如果您要获取常规的异常信息(类,消息,地址等),请参阅How to get exception information?
  2. 如果您要获取异常的调用堆栈-请参见How to get exception's call stack?
  3. 如果您希望将报告文件保存到数据库或网络共享中(包括屏幕截图,附件,网页,转储等)-请参见How to save report instead of sending?
  4. 如果要处理错误报告文件,请参见How to get file name for the bug report?

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

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

  • UploadToDB
  • TBaseDialog.SaveBugReport
  • TBaseDialog.Execute
  • ShowException
  • ProcessException
  • ExceptionManager.Handle
  • 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;