執行緒上的異常處理:
異常處理函式原型:
返回值有兩種: exceptioncontinueexecution異常已解決,exceptioncontinuesearch此seh未解決問題,繼續在seh鏈中搜尋
exception_disposition __cdecl_except_handler (
_in_
struct _exception_record *_exceptionrecord, //異常記錄結構指標
_in_ void * _establisherframe, //指向exception_registration結構,即seh鏈
_inout_ struct _context *_contextrecord, //context結構指標
_inout_ void * _dispatchercontext //無意義
);
註冊**函式的標準動作:
push offset sehhandler ;建立seh鏈標準動作
push
fs:[0
]
movfs:[0],esp ;
建立exception_registration_record結構並將
;tib偏移0改為該結構位址
err結構兩個字段:prev
//指向上乙個seh的err結構
handle //
指向本handler(處理程式)
關於指向,指標的問題在這裡又產生了一定的困擾。思路理清了後總結如下:指標就是儲存了乙個位址的變數,對指標*運算,即[ptr]的同時完成了指向的動作。[fs:0]指向err結構 的理解就是,記憶體位址fs:0處儲存的是err結構位址,那麼[fs:0](對fs:0取位址)當然就是指向err結構。關於指向xx結構,即指向此結構的第乙個字段,也就是說[fs:0]就是prev的內容。
_except_handler引數一:
typedef struct_exception_record exception_record;
_except_handler引數二:
1;******************************************2;
coded by rrouned3;
******************************************4;
例子2.thread型異常處理5;
******************************************
6 .386
7.model flat,stdcall
8 option casemap:
none
910 include windows.inc
11 include user32.inc
12includelib user32.lib
13 include kernel32.inc
14includelib kernel32.lib
1516
.data
17 sztit db "
seh例子
",018 messuc db "
修復了除0異常
",019
.data?
20hinstance dd ?21;
;-----------------------------------------
22.code
23sehhandler proc c uses ebx esi edi pexcept,pframe,pcontext,pdispatch
2425 assume esi:
ptr exception_record
26 assume edi:
ptr context
2728
movesi,pexcept
29mov
edi,pcontext
30test [esi].exceptionflags,3
31jne
_continue_search
32cmp [esi].exceptioncode,status_integer_divide_by_zero ;
是除0錯?
33jne
_continue_search
3435
mov [edi].regecx,10
;將被除數改為非0值繼續返回執行36;
這次可以得到正確結果是10
3738
mov eax,exceptioncontinueexecution ;
修復完畢,繼續執行
39ret
40_continue_search:
41mov eax,exceptioncontinuesearch ;
其他異常,無法處理,繼續遍歷seh**函式列表
42ret
43sehhandler endp
44_start:
45 assume fs:
nothing
4647
push offset sehhandler ;
建立seh鏈標準動作
48push
fs:[0]49
movfs:[0],esp ;
建立exception_registration_record結構並將50;
tib偏移0改為該結構位址51;
引發異常
52xor ecx,ecx ;
ecx=0
53mov eax,100
;eax=100
54xor edx,edx ;
edx=0
5556
div ecx ;
產生除0錯!
57 invoke messagebox,0,addr messuc,addr sztit,0
5859
popfs:[0] ;
恢復原異常**函式
60add esp,4
;平衡堆疊
6162 invoke exitprocess,0
63 end _start
C 異常與結構化異常SEH的比較
結構化異常處理seh 全稱structured exception handling 是windows作業系統所提供的對錯誤或異常的處理機制,是windows作業系統的乙個重要組成部分。q 在windows系統中,我們在開發應用程式時應該使用結構化異常還是c 異常?a seh是作業系統所提供的便利,...
Try Catch結構化異常處理
try.catch.會損耗一定的效能,但不會造成效能瓶頸。建議使用try.catch。盡可能的考慮到可能存在的異常並進行處理,盡可能的少出現異常或不出現異常。不要濫用資料庫事務提高效能,這樣可能會造成併發訪問的效能問題或效能瓶頸。不要使用try.catch進行流程處理。如果可能的話,盡量要把迴圈寫在...
結構化異常
try,catch,finally catch中的 是對異常的恢復操作。比如有狀態的恢復,回滾。finally是做一些清理工作。foreach,using,lock實際上就是轉換成try finally這種結構 finally中就是物件的清理,foreach是對inumerator.dispose ...