1
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没有任何深度复制,并在构造函数中生成格式化消息,并且它可以工作,尽管我不知道它是否真的应该工作。

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

4

1 回答 1

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 异常。

于 2014-02-06T11:10:03.340 回答