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