Delphi:如何在不使用断言的情况下获取(当前代码行,当前单元,当前函数)?

标签 delphi logging exception pascal assertion

我正在尝试在我的程序上创建一个日志系统,它将在文本文件上记录调试消息,并且我想保存代码中调用日志消息的确切位置,但我不想使用 Assert 函数因为它会创建异常,并且该系统不仅仅用于记录异常,所以我还必须编写一些调试信息。

使用断言的示例:

procedure AnyProcedure();
begin
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log occurred is '+E.Message+' : Start');//Log occurred is "c:\progr~..jkdj.pas" at line [29]
  end;

  //....some code
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log occurred is '+E.Message+' : Step1 done');//Log occurred is "c:\progr~..jkdj.pas" at line [37]
  end;

  //....some code
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log occurred is '+E.Message+' : Step2 done');//Log occurred is "c:\progr~..jkdj.pas" at line [45]
  end;

  //....some code
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log occurred is '+E.Message+' : Step3 done');//Log occurred is  "c:\progr~..jkdj.pas" at line [53]
  end;

  //....some code
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log '+E.Message+' : End');//Log occurred is "c:\progr~..jkdj.pas" at line [61]
  end;
end;

这工作正常,唯一的问题是它引发异常并且代码变得太大,所以我无法使用函数 - 请参阅下一个示例函数 LogMessage - 并在另一个地方调用它,因为该行始终是相同的文件名也将是 LogMessage 函数实现的位置:

不工作的例子:

procedure LogMessage(AMessage: String);
var AFile, ALine: String;
begin
  try
    Assert(1=0);             //line 29
  except
    on E: Exception do
    begin
      AFile:= Copy(E.Message, Pos(' (', E.Message)+2, Pos(', line ', E.Message)-Pos(' (', E.Message)-2);
      ALine:= Copy(E.Message, Pos(', line ', E.Message)+7, Pos(')', E.Message)-Pos(', line ', E.Message)-7);
      ShowMessage('Log occurred in file "'+AFile+'" at line ['+ALine+'] : '+AMessage);
    end;
  end;
end;

procedure AnyProcedure();
begin
  LogMessage('Start'); //Log occurred in file "c:\progr~....jkashdj.pas" at line [29]
//....
  LogMessage('step1'); //Log occurred in file "c:\progr~....jkashdj.pas" at line [29]
//....
  LogMessage('step2'); //Log occurred in file "c:\progr~....jkashdj.pas" at line [29]
//....
  LogMessage('step3'); //Log occurred in file "c:\progr~....jkashdj.pas" at line [29]
//....
  LogMessage('end');
end

请帮忙,提前致谢。

最佳答案

您可以绑定(bind)自己的TAssertErrorProc程序到AssertErrorProc多变的。你可能会写这样的东西:

procedure OnAssert(const Message, Filename: string; LineNumber: Integer;
  ErrorAddr: Pointer);
begin
  ShowMessage(Format('Assert in file "%s" at line %d.', [Filename, LineNumber]));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AssertErrorProc := OnAssert;
end;

关于Delphi:如何在不使用断言的情况下获取(当前代码行,当前单元,当前函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16459608/

相关文章:

Delphi:您如何自动更新您的应用程序?

Java记录器问题

logging - 工作 azure 日志记录设置

java - 自定义异常-Java

exception - Fortran 中是否存在异常处理?

Delphi TreeView : Can I have different styles in one node's text?

lazarus - 在新电脑上打开 lazarus 项目

delphi - 抽象与接口(interface) - 在 Delphi 中分离定义和实现

java - 如何使此应用程序中的 Apache Log4J 日志记录有用?

asp.net - 管理跨多种方法和网络调用的事务