class seh_exception : public std::exception {
public:
seh_exception(UINT se_code, PEXCEPTION_POINTERS se_info);
seh_exception(const seh_exception& old);
~seh_exception();
const char *what() const;
};
void translate_seh_exception(UINT se_code, PEXCEPTION_POINTERS se_info) {
throw seh_exception(se_code, se_info);
}
现在,我在构造函数中做什么?我找不到关于 *se_info
将存在多长时间的任何信息,这意味着我可能不应该只将 se_info
保存在私有(private)字段中供以后使用——我应该深深地复制它。或者可能不是?
what()
有什么用?我应该按需召唤底层字符串吗?同样,在这种情况下,在构造函数中分配内存似乎不是一个好主意。
我目前已经实现了它存储 se_code
和 se_info
没有任何深层复制,并在构造函数中生成格式化消息,它有效,虽然我不知道如果它确实应该 起作用。
我打算在“捕获、记录发生的事情、终止”场景中使用它。
最佳答案
你不需要自己的类来实现这个,你可以只抛出 PEXCEPTION_POINTERS
。 se_code
也可在 se_info->ExceptionRecord->ExceptionCode
中获得。
所以最简单的处理程序就是;
void translate_seh_exception(UINT se_code, PEXCEPTION_POINTERS se_info) {
throw se_info;
}
然后你可以catch(PEXCEPTION_POINTERS se_info)
EXCEPTION_POINTERS
保证在 catch
block 的持续时间内存在,这就是您需要它的时间。根据文档,每个 catch block 都会调用您的翻译器函数一次,也就是说,它必须为每个包含 try/catch
block 的函数重新翻译 SEH 异常。
关于c++ - 编写 SEH 翻译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21600184/