为什么 SEH 被认为是“异步的”?

Nin*_*rez 1 windows winapi exception seh

我在 SEH(结构化异常处理)上阅读的一些文章/答案认为它是“异步的”。

我的理解是这些异常的整个处理部分发生在引发它们的线程上(在 CPU 级别)。基本上,一旦发生异常,执行就会“跳转”到对当前线程异常处理程序列表进行迭代的操作系统代码。

那么我的理解正确吗?SEH 的异步究竟是什么?

Sha*_*ger 5

在异常处理的同步模型中,总是显式抛出异常;一个实际的throw语句必须出现在源代码中,在指令流中一个已知且明确定义的点,以便编译器知道何时会发生异常(这也意味着它可以优化异常处理代码,如果它可以证明没有异常可以发生)。

SEH 是关于 CPU 触发的异常,代码本身没有意识到可能发生的事情,但可以说是“带外”引发的。它是异步的,因为异常被注入到甚至不知道它可能发生的代码中,就像信号处理程序可以在主线程中运行一样,中断接收信号时实际发生的任何事情。

SEH 可以被认为很像临时注册的信号处理程序,其中异常条件是信号,__try块定义处理程序在何处生效,如果接收到“信号” ,则__except__finally块是处理程序。