我是一个Windows API的初学者,所以一定有一些我不明白的地方。 在我的主要function,我使用try-catch捕获所有未捕获的exception,但由于某种原因,从代码中的其他地方抛出的exception从未被捕获。 我的应用程序使用一个(主)线程。
我这样扔:
throw "ClassName::methodName() - Error message";
捕获消息循环之外的exception:
try { while(GetMessage(args...)) { TranslateMessage(args...); DispatchMessage(args...); } } catch( const char * sExc ) { ::MessageBox(args...); }
我首先以为这是一个types不匹配的问题,但后来我用省略号加了一个catch(…),但是我什么也没有发现。 如果你问,是的,我相信这个例外是抛出的。 这不是一个类似的asynchronous或类似的问题?
谢谢你的帮助 !
这取决于正在发送的特定消息。 但不是,并非所有这些都允许堆栈通过Windows内部代码解开。 特别是涉及窗口管理器的消息,例如WM_CREATE。 在Windows内部有一个阻止阻止栈被解开的关键代码。 在64位版本的Windows 7上运行的32位代码中也存在例外问题,当消息需要多次遍历Wow64边界时,可能会被吞下。 在Windows 8中修复。
在更高版本的Windows上,这也可以激活“自我修复”代码,自动激活一个吞噬异常的appcompat shim。 你会得到一个通知,容易驳回。 然后,您将在“VS输出”窗口中看到第一次机会异常通知,但是程序仍在运行。 当然,对于用户来说好的也许不是很好。 运行Regedit.exe并导航到HKCU \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Compatibility Assistant \ Persisted,并检查您的程序是否在那里列出。 只要删除条目。
长话短说,在消息循环之外捕获异常是不安全的。 你必须在窗口过程中做到这一点。
您正在讨论“Windows结构化异常处理”( http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx )。 不会引发C ++异常。
如果你想去麻烦的路线:_set_se_translator
另请参阅: C程序是否可以处理C ++异常? (Windows API不是C ++)