c++ - 编写 SEH 翻译器

标签 c++ winapi exception 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 保存在私有(private)字段中供以后使用——我应该深深地复制它。或者可能不是?

what() 有什么用?我应该按需召唤底层字符串吗?同样,在这种情况下,在构造函数中分配内存似乎不是一个好主意。

我目前已经实现了它存储 se_codese_info 没有任何深层复制,并在构造函数中生成格式化消息,它有效,虽然我不知道如果它确实应该 起作用。

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

最佳答案

你不需要自己的类来实现这个,你可以只抛出 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 block 的持续时间内存在,这就是您需要它的时间。根据文档,每个 catch block 都会调用您的翻译器函数一次,也就是说,它必须为每个包含 try/catch block 的函数重新翻译 SEH 异常。

关于c++ - 编写 SEH 翻译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21600184/

相关文章:

c++ - HPUX 上的套接字未收到完整数据

winapi - 默认按钮大小?

Python raise Error正确使用

c++ - 如何使用 C++ 在 Windows 上创建具有 UNICODE 路径的文件

c++ - 为右值参数隐式生成函数重载?

c - 安全标识符 "directory"导致我的程序崩溃

C++ 获取进程所有者/当前用户 token

java - CompletableFuture 异常处理 runAsync & thenRun

java - Exception Java 的异常构造函数

c++ - 2 解决虚方法二义性继承的方法