编译器扩展SEH(1)
生活随笔
收集整理的這篇文章主要介紹了
编译器扩展SEH(1)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 編譯器支持的SEH
- 過濾表達(dá)式規(guī)則:
- 過濾表達(dá)式的3種情況
- 直接寫常量值
- 表達(dá)式
- 調(diào)用函數(shù)
編譯器支持的SEH
__try{ --------------------------------------->1.掛入鏈表}__except(過濾表達(dá)式)--------------------------------->2.異常過濾{異常處理程序 ------------------------------------>異常處理程序}過濾表達(dá)式規(guī)則:
過濾表達(dá)式的3種情況
常量值:
__except (1)情況:去執(zhí)行except內(nèi)部代碼
表達(dá)式:
異常錯誤是除零異常的話,返回EXCEPTION_EXECUTE_HANDLER(去執(zhí)行except內(nèi)部代碼),不是除零異常的話就返回EXCEPTION_CONTINUE_SEARCH(尋找下一個異常處理函數(shù))
調(diào)用函數(shù)
__except (ExceptFilter(GetExceptionInformation()))這需要看函數(shù)內(nèi)部所進行的操作,這和前面所述SEH和VEH那些執(zhí)行流程都一樣,結(jié)構(gòu)體和參數(shù)屬性都一樣
直接寫常量值
代碼:
#include<Windows.h> #include<iostream>void TestException(){__try{__asm {xor edx,edxxor ecx,ecxmov eax,0x10idiv ecx//EDX:EAX除以ECX}}__except (1) {printf("如果出現(xiàn)異常,我來處理");}}int main() {TestException(); }表達(dá)式
代碼:
#include<Windows.h> #include<iostream>void TestException(){__try{__asm {xor edx,edxxor ecx,ecxmov eax,0x10idiv ecx//EDX:EAX除以ECX}} __except (GetExceptionCode()==0xC0000094?EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH){printf("如果出現(xiàn)異常,我來處理");}}int main() {TestException(); }調(diào)用函數(shù)
代碼
#include<Windows.h> #include<iostream>int ExceptFilter(LPEXCEPTION_POINTERS pExceptionInfo) {pExceptionInfo->ContextRecord->Ecx = 1;return EXCEPTION_CONTINUE_EXECUTION; }void TestException(){__try{__asm {xor edx,edxxor ecx,ecxmov eax,0x10idiv ecx//EDX:EAX除以ECX}}__except (ExceptFilter(GetExceptionInformation())) {printf("如果出現(xiàn)異常,我來處理");}} int main() {TestException(); }總結(jié)
以上是生活随笔為你收集整理的编译器扩展SEH(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SEH(结构化异常处理)
- 下一篇: 编译器扩展SEH(2)