写SEH翻译

时间:2014-02-06 10:26:41

标签: c++ winapi exception exception-handling seh

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_codese_info而没有任何深度复制,并在构造函数中生成格式化的消息,并且它可以工作,但我不知道它是否实际上是假设工作。

我打算在“捕获,记录发生的事情,终止”场景中使用它。

1 个答案:

答案 0 :(得分:0)

你不需要自己的课程来实现这一点,你可以抛出PEXCEPTION_POINTERSse_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异常。