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
保存在私有字段中供以后使用 - 我应该深入复制它。或许不是吗?
what()
有什么用?我应该根据需要召唤底层字符串吗?同样,在这种情况下,在构造函数中分配内存似乎不是一个好主意。
我目前已经实现了存储se_code
和se_info
而没有任何深度复制,并在构造函数中生成格式化的消息,并且它可以工作,但我不知道它是否实际上是假设工作。
我打算在“捕获,记录发生的事情,终止”场景中使用它。
答案 0 :(得分:0)
你不需要自己的课程来实现这一点,你可以抛出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
块的持续时间内存在,这是您需要的时间。根据文档,您的翻译函数会针对每个catch块调用一次,也就是说,它必须为包含try/catch
块的每个函数重新翻译SEH异常。