删除或仅使用相对路径或文件名替换EAssertionFailed的绝对路径吗?

最高

有什么方法可以删除或替换EAssertionFailed错误消息的绝对路径吗?我不想包含整个路径,以不间接揭示源代码的编译位置并使消息独立于该位置。最好是,到项目根目录或DPR文件的相对路径或仅源文件名将包含在错误消息中。


程序输出:

EAssertionFailed: Assertion failed (C:\Users\User\Documents\
Embarcadero\Studio\Projects\Project3.dpr, line 12)

Project3.dpr

program Project3;

{$AppType Console}

{$R *.res}

uses
  System.SysUtils;

begin
  try
    Assert(False);
  except
    on E: Exception do
    begin
      WriteLn(E.ClassName, ': ', E.Message);
      ReadLn;
    end;
  end;
end.
戴夫·奥尔森

替换或挂钩AssertErrorProc并更改或隐藏文件名和行号信息。

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysConst,
  System.SysUtils;

   procedure CustomAssertErrorHandler(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);

   var
      FileNameOnly : string;

   begin
      FileNameOnly := ExtractFileName(FileName);

      if Message <> '' then
        raise EAssertionFailed.CreateFmt(SAssertError,
          [Message, FileNameOnly, LineNumber]) at ErrorAddr
      else
        raise EAssertionFailed.CreateFmt(SAssertError,
          [SAssertionFailed, FileNameOnly, LineNumber]) at ErrorAddr;
   end;

begin
   AssertErrorProc := CustomAssertErrorHandler;

 try
    Assert(False);
  except
    on E: Exception do
    begin
      WriteLn(E.ClassName, ': ', E.Message);
      ReadLn;
    end;
  end;
end.

更新:这是发问者的解决方案,它将完整的项目路径转换为相对路径:

program Project3;

{$AppType Console}

{$R *.res}

uses
  System.SysConst,
  System.SysUtils;

procedure AssertErrorHandler(const Msg, Filename: String; 
  LineNumber: Integer; ErrorAddr: Pointer);

{$Region '$Include ProjectRoot.pas.inc'}

const
   ProjectRoot = 'C:\Users\';

{$EndRegion}

var
  Temp: String;

begin
  if (ProjectRoot <> '') and Filename.StartsWith(ProjectRoot) then
    Temp := Filename.Remove(0, ProjectRoot.Length)
  else
    Temp := ExtractFileName(Filename);

  if Msg <> '' then
    raise EAssertionFailed.CreateResFmt(@SAssertError,
      [Msg, Temp, LineNumber]) at ErrorAddr
  else
    raise EAssertionFailed.CreateResFmt(@SAssertError,
      [SAssertionFailed, Temp, LineNumber]) at ErrorAddr;
end;

begin
  try
    AssertErrorProc := AssertErrorHandler;
//    Assert(False);
    Assert(False, 'Custom message');
  except
    on E: Exception do
    begin
      WriteLn(E.ClassName, ': ', E.Message);
      ReadLn;
    end;
  end;
end.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章