_set_se_translator设置的转换函数可否直接返回不抛出异常?
_set_se_translator注册函数无异常返回的行为规范 - 你通过
_set_se_translator设置的转换函数支持直接返回、不抛出任何C++异常,这个行为是MSVC运行时明确规定的可依赖行为,不属于未定义场景。 - 当转换函数正常返回、未抛出C++异常时,异常处理流程会完全回退到原生SEH分发逻辑,和没注册translator时的SEH处理规则完全一致。
你编写的测试代码会稳定输出caught,整个执行流程完全符合官方规范,具体逻辑是:
RaiseException触发SEH异常后,VC++运行时优先查找当前线程注册的se_translator回调,调用你写的空lambda。- 该lambda没有抛出任何C异常,运行时不会启动C异常栈展开、catch块匹配逻辑,直接将控制权交还给Windows原生SEH异常分发器。
- SEH分发器正常遍历栈帧上的异常处理器,匹配到你写的
__except(EXCEPTION_EXECUTE_HANDLER)块后进入执行,打印对应内容。
注意:上述可预期行为仅在编译时开启
/EHa异常模型(同时支持C++异常与异步SEH异常)时成立。如果使用默认的/EHsc编译选项,SEH异常不会触发translator回调,相关行为属于未定义范畴。
测试代码如下,可直接在MSVC环境下编译验证:
#include <Windows.h> #include <iostream> #include <stdexcept> using namespace std; int main() { _set_se_translator( []( unsigned int, EXCEPTION_POINTERS * ) { } ); __try { RaiseException( EXCEPTION_IN_PAGE_ERROR, 0, 0, nullptr ); } __except( EXCEPTION_EXECUTE_HANDLER ) { cout << "caught" << endl; } }
内容的提问来源于stack exchange,提问作者Bonita Montero
相关产品推荐
相关产品推荐

