assert 過程原形
[code]procedure assert (expr :boolean [; const msg: string]);[/code]
在system.pas 裡 assert 的實現是:
procedure _assert(const message, filename: ansistring; linenumber: integer);
begin
if assigned(asserterrorproc) then
asserterrorproc(message, filename, linenumber, pointer(-1))
else
error(reassertionfailed); // loses return address
end;
asmpush ebx
push eax
push ecx
call getgot
mov ebx, eax
mov eax, [ebx].asserterrorproc
cmp [eax], 0
pop ecx
pop eax
cmp asserterrorproc,0
jnz @@1
mov al,reassertionfailed
call error
jmp @@exit
@@1: push [esp+4].pointer
mov ebx, [ebx].asserterrorproc
call [ebx]
call asserterrorproc
@@exit:
pop ebx
end;
可以看出asserterrorproc() 是沒有初值的,通過對其賦值可以定義自己的assert處理過程,另如果未對asserterrorproc賦值,將呼叫error()處理過程來做為異常處理.
tasserterrorproc = procedure (const message, filename: string;
linenumber: integer; erroraddr: pointer);
開關來決定assert是否被呼叫.可以在project-option-complier裡設定.
這樣就可以在beta或debug版本是開啟,而最終發布時關閉除錯輸出了.
乙個簡單的asserterrorproc 例程:
unit assertlogs;
inte***ce
implementation
uses
windows,
sysutils;
varrunerrmsg : string;
oldasserterrorproc : tasserterrorproc;
procedure logassert(const message, filename: string; linenumber: integer; erroraddr: pointer);
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;
initialization
oldasserterrorproc := asserterrorproc;
asserterrorproc := @logassert;
finalization
asserterrorproc := oldasserterrorproc;
end.
*************************************
那麼在output debug資訊時只需要:
assert(false,outputstring);
Delphi下用WindowsAPI建立窗體
delphi 下呼叫windows api 建立窗體.模板 by hottey 2004 4 13 0 18 作者 視窗訊息處理函式.function mywinproc hwnd thandle umsg uint wparam,lparam cardinal cardinal exp ort s...
delphi提示錯誤行號之Assert 斷言
一 用法 assert 表示式 1.如果為假 assert會產生乙個eassertionfailed異常,顯示為 assertion failed c src unit1.pas,size 0 line 34 2.如果不想再使用這些檢查時,可以使用 assertions off 或 c 編譯指令 3...
什麼時候用assert?
assertion 斷言 是軟體測試的一種除錯方式,很多開發語言都支援這種機制。在實現中,assertion在程式中就是一條語句,assertion對boolean表示式進行檢查,乙個正確程式中的boolean表示式的值是true的,如果值為false,那麼,該程式已經處於不正確的情況下了,系統將給...