delphi下 用assert來完成錯誤的捕捉

2021-06-16 02:56:19 字數 2150 閱讀 8758

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,那麼,該程式已經處於不正確的情況下了,系統將給...