2

在某些情况下,我想调用RaiseException()以在传递给 Win32 函数的回调中引发异常。

作为一个例子,我想调用RaiseException()一个并在调用堆栈更下方的LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM)一个块中处理它。__try { } __except() { }

这是否“安全”,因为它将在 x86 和 amd64 上具有可预测的结果?从不会泄漏资源的意义上说,它是否“安全”†?

†:假设我控制的任何中间堆栈帧都以不会泄漏资源的方式设置。我只关心对我来说“不透明”的 Win32 API 堆栈帧。

4

1 回答 1

0

根据我的经验,当您依赖于成为第一个(也是唯一一个)异常处理程序时,任意引发 SEH 异常是不安全的。有许多机制可以首先拦截您的异常 - 例如,任何充当调试器的东西 - 并采取您不期望的操作。

这似乎是一种代码异味——有没有其他方法可以构建代码来避免这种情况?你能用一个(不那么邪恶的)goto吗?

于 2014-08-14T20:39:01.773 回答