加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi:如何获取(当前代码行,当前单位,当前函数)而不使用Assert

发布时间:2020-12-15 09:50:00 所属栏目:大数据 来源:网络整理
导读:我正在尝试在我的程序上创建一个日志系统,它将记录文本文件上的调试消息,我想保存调用日志消息的代码中的确切位置,但我不想使用Assert函数,因为它创建例外,这个系统不仅仅用于记录异常,我还要编写一些调试信息. 使用断言的示例: procedure AnyProcedure();b
我正在尝试在我的程序上创建一个日志系统,它将记录文本文件上的调试消息,我想保存调用日志消息的代码中的确切位置,但我不想使用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-并在另一个地方调用它,因为该行也将是相同的文件name将是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,E.Message)+7,Pos(')',E.Message)-Pos(',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

请帮助,并提前感谢.

解决方法

您可以将自己的 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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读