是否有可能捕获WindowProc回调中的错误?try / catch无法工作。看起来__try __except和硬件异常(例如AV)也不起作用。
更新:
我发现,这确实可以在WindowProc回调中抛出异常,并在WindowProc之外的catch块中捕获它。测试并在Windows XP x86上工作。我发现了相关的问题WndProc中的64位异常无声失败,这个问题似乎只存在于Windows 7 x64上(根据其他x64 Windows版本也存在这个问题)。
所以问题是,在WindowProc中抛出异常并在WindowProc之外用catch块捕获它是可能的吗?我安装了microsoft,在注册表中将DisableUserModeCallbackFilter设置为1,最好是FATAL_USER_CALLBACK_EXCEPTION,而不是我的例外。
发布于 2013-03-08 11:33:26
用于WindowProc的MSDN文档提供了有关从WindowProc引发/传播的异常的详细信息。异常似乎只在32位版本的Windows中传播。
但是,您的原始问题与更新中的问题不同。第一个是关于在WindowProc中捕获异常,这将始终正常工作。第二个问题是关于从WindowProc抛出异常。
我不确定第二次考试是否有用/必要。通常调用窗口过程的原因是:
发布于 2019-02-22 02:34:03
使用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);发布于 2021-10-19 05:25:12
Chronial给出了最好的答案。我会给出我认为是有用的改进。
Chronial的概念是允许在窗口过程中使用cpp抛出机制,但不要让它在窗口过程之外传播;它在C库中调用,导致64位窗口上的未定义行为,即64位win 7或windows 8。相反,捕获窗口过程中的异常,并将其保存在全局变量中,然后将其重新抛入cpp主函数并使用。有关代码示例,请参见Chronial的答案。
这个概念很简单,但需要一些细节才能得到100%的正确。
https://stackoverflow.com/questions/14642722
复制相似问题