为什么 SEH 被认为是 "asynchronous"?
Why is SEH considered "asynchronous"?
我在 SEH(结构化异常处理)上阅读的一些文章/答案认为它是 'asynchronous'。
据我了解,这些异常的整个处理部分发生在引发它们的线程上(在 CPU 级别)。基本上,一旦发生异常,执行 'jumps' 到 OS 的代码会在当前线程异常处理程序列表上迭代。
那么我的理解对吗? SEH 究竟是什么异步?
在异常处理的同步模型中,异常总是被显式抛出;实际的 throw
语句必须出现在源代码中,在指令流中已知且明确定义的点,以便编译器知道何时会发生异常(这也意味着它可以优化异常处理代码,如果它可以证明不会出现异常)。
SEH 是关于 CPU 触发的异常,代码本身没有意识到的事情可能会发生,但可以说 "out of band" 被引发了。它是异步的,因为异常被注入到甚至不知道它可能发生的代码中,这与信号处理程序可以在主线程中 运行 的方式非常相似,中断接收到信号时实际发生的任何事情。
SEH 可以被认为很像临时注册的信号处理程序,其中异常条件是信号,__try
块定义处理程序在何处生效,__except
和 __finally
块是处理程序,如果收到 "signal"。
我在 SEH(结构化异常处理)上阅读的一些文章/答案认为它是 'asynchronous'。
据我了解,这些异常的整个处理部分发生在引发它们的线程上(在 CPU 级别)。基本上,一旦发生异常,执行 'jumps' 到 OS 的代码会在当前线程异常处理程序列表上迭代。
那么我的理解对吗? SEH 究竟是什么异步?
在异常处理的同步模型中,异常总是被显式抛出;实际的 throw
语句必须出现在源代码中,在指令流中已知且明确定义的点,以便编译器知道何时会发生异常(这也意味着它可以优化异常处理代码,如果它可以证明不会出现异常)。
SEH 是关于 CPU 触发的异常,代码本身没有意识到的事情可能会发生,但可以说 "out of band" 被引发了。它是异步的,因为异常被注入到甚至不知道它可能发生的代码中,这与信号处理程序可以在主线程中 运行 的方式非常相似,中断接收到信号时实际发生的任何事情。
SEH 可以被认为很像临时注册的信号处理程序,其中异常条件是信号,__try
块定义处理程序在何处生效,__except
和 __finally
块是处理程序,如果收到 "signal"。