function getTicketBit(vTicketNo:integer):integer; begin Dec(vTicketNo); Assert((vTicketNo >= 0),'票據編號不可小於 0'); Result := round(intpower(2,vTicketNo)); end;
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; procedure LogAssert(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer); var Form1: TForm1; OldAssertErrorProc : TAssertErrorProc; implementation{$R *.dfm}procedure LogAssert(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer); var RunErrMsg : String; begin runErrMsg := format('Error: %s, Addr: %p, in file(%d): %s ', [Message, ErrorAddr, LineNumber, FileName]); if IsConsole then Writeln(runErrMsg) else MessageBox(0, pChar(runErrMsg), 'Error Log by AssertLogs', 0); end;procedure TForm1.btn1Click(Sender: TObject); var outputstring:string; begin Assert(false,outputstring);end;initialization oldAssertErrorProc := AssertErrorProc; AssertErrorProc := @LogAssert;finalization AssertErrorProc := oldAssertErrorProc;end.
用Assert的话,只能得到 Assert调用的行数。想实现的是try //一些处理 except on e: Exception do begin //Start 假设用 Assert的话 Assert(false, e.Message); //只能捕获到这一行,并不能真正捕获到出错的行数 //END 假设用 Assert的话//Start 希望实现的 Applog.TraceLog(e); // Applog是一个类,TraceLog是一个把异常信息写入Log的方法。 //End 希望实现的 end; end;
我是指在程序里捕获,然后把错误的详细信息写入log文件。
我是指在程序里捕获,然后把错误的详细信息写入log文件。
并非调试状态。
begin
Dec(vTicketNo);
Assert((vTicketNo >= 0),'票據編號不可小於 0'); Result := round(intpower(2,vTicketNo));
end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations } public
{ Public declarations }
end;
procedure LogAssert(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
var
Form1: TForm1;
OldAssertErrorProc : TAssertErrorProc;
implementation{$R *.dfm}procedure LogAssert(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
var
RunErrMsg : String;
begin
runErrMsg := format('Error: %s, Addr: %p, in file(%d): %s ',
[Message, ErrorAddr, LineNumber, FileName]);
if IsConsole then
Writeln(runErrMsg)
else
MessageBox(0, pChar(runErrMsg), 'Error Log by AssertLogs', 0);
end;procedure TForm1.btn1Click(Sender: TObject);
var
outputstring:string;
begin
Assert(false,outputstring);end;initialization
oldAssertErrorProc := AssertErrorProc;
AssertErrorProc := @LogAssert;finalization
AssertErrorProc := oldAssertErrorProc;end.
//一些处理
except
on e: Exception do
begin
//Start 假设用 Assert的话
Assert(false, e.Message); //只能捕获到这一行,并不能真正捕获到出错的行数
//END 假设用 Assert的话//Start 希望实现的
Applog.TraceLog(e); // Applog是一个类,TraceLog是一个把异常信息写入Log的方法。
//End 希望实现的
end;
end;
还有一个 http://help.madshi.net/madExcept.htm难道只能通过第3方控件或dll吗,delphi中自带的类什么的不能实现?
Exception中的StackInfo属性看上去能取到些信息,可是调试一看是nil。不理解。