繁体   English   中英

C ++ / WINDOWS-无法捕获异常

[英]C++ / WIndows - Can't catch exceptions

我是Windows API的初学者,所以这里一定有我不明白的东西。 在我的主要功能中,我使用了try-catch来捕获所有未捕获的异常,但是由于某些原因,我从未捕获过从代码中其他位置抛出的异常。 我的应用程序使用一个(主)线程。

我这样扔:

throw "ClassName::methodName() - Error message";

并在消息循环之外捕获异常:

try {
    while(GetMessage(args...)) {
        TranslateMessage(args...);
        DispatchMessage(args...);
    }
}
catch( const char * sExc ) {
    ::MessageBox(args...);
}

我首先以为这是类型不匹配的问题,但是后来我用省略号添加了catch(...),但我仍然一无所获。 如果您询问,是的,我确定会引发异常。 这不是与某种异步性或类似问题有关的问题吗?

谢谢你的帮助 !

这取决于要发送的特定消息。 但是不,并非所有人都允许通过Windows内部代码解开堆栈。 特别是涉及窗口管理器的消息,例如WM_CREATE。 Windows内部有一个后备支持,可防止堆栈通过关键代码解开。 在64位版本的Windows 7上运行的32位代码异常也存在问题,当消息需要多次穿越Wow64边界时,它们可能会被吞噬。 在Windows 8中修复。

在更高的Windows版本上,这也可以激活“自我修复”代码,从而自动激活吞没异常的appcompat填充程序。 您会收到通知,该通知很容易消除。 然后,您将在VS Output窗口中看到第一次机会异常通知,但是您的程序继续运行。 当然对用户来说还可以,但在调试时效果不是很好。 运行Regedit.exe并导航到HKCU \\ Software \\ Microsoft \\ Windows NT \\ CurrentVersion \\ AppCompatFlags \\ Compatibility Assistant \\ Persisted,然后检查程序是否在此处列出。 只需删除条目。

长话短说,在消息循环之外捕获异常并不安全。 您必须在窗口过程中执行此操作。

您正在谈论“ Windows结构化异常处理”( http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms680657%28v=vs.85%29.aspx )。 不抛出C ++异常。

如果您要走麻烦的路线:_set_se_translator

另请参见: C程序可以处理C ++异常吗? (Windows API不是C ++)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM