是否有可能在WindowProc
回调中捕获错误? try
/ catch
不起作用。看起来像__try
__except
和硬件异常(例如AV
)也不起作用。
更新:
我发现确实可以在WindowProc
回调中抛出异常并用catch
之外的WindowProc
块捕获它。测试并在Windows XP x86
上工作。我找到了相关的问题64bit exceptions in WndProc silently fail问题似乎只存在于Windows 7 x64
(并根据其他x64 Windows版本的问题)。
所以问题是有可能以某种方式在WindowProc
中抛出异常并用catch
之外的WindowProc
块捕获它吗?我安装了microsoft hotfix,在注册表中将DisableUserModeCallbackFilter
设置为1,最好的是FATAL_USER_CALLBACK_EXCEPTION
,而不是我的例外。
MSDN documentation for WindowProc有关于从WindowProc抛出/传播的异常的详细信息。似乎异常仅在32位版本的Windows中传播。
但是,您的原始问题与更新中的问题不同。第一个是关于在WindowProc中捕获异常,这将始终正常工作。第二个是关于从WindowProc抛出异常。
我不确定第二个的用处/必要性。窗口过程通常被调用为以下结果:
使用C ++ 11,您可以通过手动转发任何异常来处理您的情况:
#include <exception>
std::exception_ptr windowProcException = nullptr;
LRESULT windowProc(){
try {
yourcode();
catch(...){
windowProcException = std::current_exception();
}
}
然后,您可以在主循环中重新抛出异常,如下所示:
windowProcException = nullptr;
DispatchMessage();
if (windowProcException)
std::rethrow_exception(windowProcException);