C++基于SEH二次封装的异常流程与识别
在看代码之前我们先连简单的看下try的处理流程吧
- 函数入口设置回调函数
- 函数的异常抛出使用了__CxxThrowException函数,此函数包含了两个参数,分别是抛出一场关键字的throw的参数的指针,另一个抛出信息类型的指针(ThrowInfo *)。
- 在异常回调函数中,可以得到异常对象的地址和对应ThrowInfo数据的地址以及FunInfo表结构的地址。根据记录的异常类型,进行try块的匹配工作
- 没找到try块怎么办?先调用异常对象的析构函数,然后反汇ExcetionContinueSearch,继续反回到SEH继续执行。
- 找到了try块?通过TryBlockMapEntry结构中的pCatch指向catch信息,用ThrowInfo结构中的异常类型遍历查找相匹配的catch块,比较关键字名称,找到有效的catch块。
- 然后进行栈展开。
- 析构try块中的对象
- 跳转到catch块中执行
- 调用_JumpToContinuation函数,返回catch语句块的结束地址。