visual c++ SEH - EXCEPTION_DISPOSITION枚举和__except()过滤器表达式之间的

visual C++ SEH - correlation between EXCEPTION_DISPOSITION enum and __except() filter expressions

本文关键字:过滤器 表达式 之间 except 枚举 SEH c++ EXCEPTION visual DISPOSITION      更新时间:2023-10-16

我目前正在阅读关于结构化异常处理 (SEH)机制,并在c++中做一些练习。

我不明白的一件事是-

excpt.h文件中有两个重要的定义"groups":

  1. EXCEPTION_DISPOSITION枚举定义和_except_handler回调函数定义
  2. 三个宏的定义——EXCEPTION_EXECUTE_HANDLER(值为1)、EXCEPTION_CONTINUE_SEARCH(值为0)、EXCEPTION_CONTINUE_EXECUTION(值为- 1)

As I understand -

  • EXCEPTION_DISPOSITION的值在通过异常回调函数处理程序的链表时使用(使用_EXCEPTION_REGISTRATION struct,由线程信息/环境块指向,由FS寄存器指向)。

  • 三个宏的值用作_except过滤器

EXCEPTION_DISPOSITION枚举的一些名称与上面提到的三个宏具有相同的名称,但它们具有绝对不同的职责(一些用作_except过滤器,另一些用于迭代_EXCEPTION_REGISTRATION的链表)。

基本上我的问题是-这种相关性的原因是什么?它们之间是否存在某种"交集"?(它们是否以某种方式"协同工作"?)

我错过了什么吗?

msvc++运行时库对异常的支持是建立在操作系统对异常(SEH)的支持之上的。当然,两者之间有很强的相关性。操作系统只需要- 1,0或1来决定下一步做什么,宏值从SDK中复制。

与枚举不直接匹配,由编译器生成的异常过滤器返回,由c++的try/catch关键字生成。运行时库解释该值并生成SEH值。"嵌套异常"answers"碰撞unwind"究竟是什么意思,嗯,很模糊。并非所有的源代码都是可用的。您需要将其视为纯粹的实现细节,它根本不会影响您自己的代码。

只能在自己的__except()中使用SEH值。