WindowProc中的异常

问题描述 投票:5回答:2

是否有可能在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,而不是我的例外。

c++ winapi exception-handling seh
2个回答
4
投票

MSDN documentation for WindowProc有关于从WindowProc抛出/传播的异常的详细信息。似乎异常仅在32位版本的Windows中传播。

但是,您的原始问题与更新中的问题不同。第一个是关于在WindowProc中捕获异常,这将始终正常工作。第二个是关于从WindowProc抛出异常。

我不确定第二个的用处/必要性。窗口过程通常被调用为以下结果:

  1. 在消息循环中调用DispatchMessage。在这种情况下不需要抛出异常,因为这样做只会导致应用程序退出。如果遇到应该导致应用程序退出的错误,只需调用PostQuitMessage(0)
  2. 调用SendMessage。在这种情况下,你真的不想抛出异常,因为窗口过程将在UI线程中执行,如果调用线程与UI线程不同,调用线程无论如何都不会得到异常
  3. 直接调用窗口过程。在这种情况下,例外情况会正常。

0
投票

使用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);
© www.soinside.com 2019 - 2024. All rights reserved.