更換或鉤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.
寫自己的處理程序([AssertErrorProc(HTTP:// docwiki.embarcadero.com/Libraries/en/System.AssertErrorProc)),或掛鉤現有的。 – Victoria