2016-11-30 200 views
0

我有使用第三方库的代码。如何在C++中捕获错误__try __except不能

该库引发偶尔的访问冲突异常。一个基本的try/catch没有发现错误,程序很难崩溃。

我能够使用__try __except来代替错误,记录它,然后正常退出程序。

第三方刚刚更新了自己的图书馆,现在该是导致访问冲突错误记录的一小部分只是死在生产带有“[程序名称]已停止工作”

在Visual Studio中,当步进通过我得到“Microsoft Visual Studio C运行时库已经在[程序名称]中检测到一个致命错误。”

我已经更新了我的__except语句来捕捉所有事情(或者我相信),它仍然会发生。

原始__except:

__except (eps = GetExceptionInformation(), ((GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) 
       ? EXCEPTION_EXECUTE_HANDLER 
       : EXCEPTION_CONTINUE_SEARCH)) { 
     sprintf("error message"); 
     result = 99; 
} 

新__except:

__except (eps = GetExceptionInformation(), ((1 == 1) 
       ? EXCEPTION_EXECUTE_HANDLER 
       : EXCEPTION_CONTINUE_SEARCH)) { 
     sprintf("error message"); 
     result = 99; 
} 

回答

0

只是一个友好的仅供参考,你的异常过滤器eps = GetExceptionInformation()第一表达似乎未被使用。

此外,如果您想要捕获所有异常,那么__except (EXCEPTION_EXECUTE_HANDLER)应该是您所需要的。虽然我只会建议用于调试目的。

如果这不能捕捉到您的异常,库可能会尝试处理异常本身以及库中本身正在发生的奇怪事情。我会与图书馆的提供者核实并询问这是否是已知问题。

+0

感谢您的建议,我尝试了 __except(EXCEPTION_EXECUTE_HANDLER) 结果与其他两个相同。我已经问了第三方,但是他们的时间框架对于修复来说往往太长了,这就是为什么我必须首先处理他们的访问冲突。 –

+0

你有权访问他们的符号和源代码吗?你能够在他们的最终调试它来弄清楚异常是如何发生的吗?如果即使使用__except(EXCEPTION_EXECUTE_HANDLER),异常也不会被捕获,那么我的直觉就是库试图处理异常,所以你的代码永远不会得到它。 –

+0

不幸的是我没有访问权限。我对开发者提出了一个问题,引用了示例记录的行为,以及新行为之前/之后的版本号,听起来像我可能会被卡住,直到我听到回声。感谢您的帮助。 –