記事のディレクトリ
コンパイラでサポートされているSEH
__try{
--------------------------------------->1.挂入链表
}__except(过滤表达式)--------------------------------->2.异常过滤
{
异常处理程序 ------------------------------------>异常处理程序
}
フィルタ式のルール:
- EXCEPTION_EXECUTE_HANDLER(1)コード以外で実行
- EXCEPTION_CONTINUE_SEARCH(0)次の例外処理関数を検索します
- EXCEPTION_CONTINUE_EXECUTION(-1)はエラーの場所に戻り、再度実行します
フィルタ式の3つのケース
定数値:
__except (1)
状況:
式以外の内部コードを実行する場合:
__except (GetExceptionCode()==0xC0000094?EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH)
例外エラーがゼロ除算例外の場合はEXCEPTION_EXECUTE_HANDLERを返し(内部コードを除く)、ゼロ除算例外でない場合はEXCEPTION_CONTINUE_SEARCHを返します(次の例外処理関数を探します)
関数を呼び出す
__except (ExceptFilter(GetExceptionInformation()))
これは、関数内で実行される操作によって異なります。これは、前述のSEHおよびVEHの実行プロセスと同じであり、構造とパラメーターの属性は同じです。
定数値を直接書き込む
コード:
#include<Windows.h>
#include<iostream>
void TestException(){
__try{
__asm {
xor edx,edx
xor ecx,ecx
mov eax,0x10
idiv ecx//EDX:EAX除以ECX
}
}
__except (1) {
printf("如果出现异常,我来处理");
}
}
int main() {
TestException();
}
式
コード:
#include<Windows.h>
#include<iostream>
void TestException(){
__try{
__asm {
xor edx,edx
xor ecx,ecx
mov eax,0x10
idiv 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,edx
xor ecx,ecx
mov eax,0x10
idiv ecx//EDX:EAX除以ECX
}
}
__except (ExceptFilter(GetExceptionInformation())) {
printf("如果出现异常,我来处理");
}
}
int main() {
TestException();
}