在回调中RaiseException(...)win32 seh异常是否安全? (在x86和x64上)

时间:2014-08-14 20:09:12

标签: c winapi x86 x86-64 seh

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

这看起来像代码味道 - 是否有其他方法来构建代码以避免这种情况?你能用一个(不那么邪恶的)转到吗?