编译器支持的SEH
__try{
--------------------------------------->1.挂入链表
}__except(过滤表达式)--------------------------------->2.异常过滤
{
异常处理程序 ------------------------------------>异常处理程序
}
过滤表达式规则:
- EXCEPTION_EXECUTE_HANDLER(1)执行except代码
- EXCEPTION_CONTINUE_SEARCH(0)寻找下一个异常处理函数
- EXCEPTION_CONTINUE_EXECUTION(-1)返回出错位置重新执行
过滤表达式的3种情况
常量值:
__except (1)
情况:去执行except内部代码
表达式:
__except (GetExceptionCode()==0xC0000094?EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH)
异常错误是除零异常的话,返回EXCEPTION_EXECUTE_HANDLER(去执行except内部代码),不是除零异常的话就返回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();
}