我有一个第三方库有时会抛出一个异常。所以我决定换我的代码在一个try/catch(...),这样我可以记录有关发生的异常信息(无具体细节,只是它发生了。)无法捕捉C++异常使用catch(...)
但由于某些原因,该代码仍然崩溃。在客户端计算机上,它崩溃并且在catch(...)中记录异常的代码从未得到执行。如果我在我的调试/开发机器上运行这个,我会弹出一个询问我是否需要调试的问题。当我这样做时,它会报告0xC0000005:访问冲突读取位置XXX。
奇怪的是,使用旧版本的第三方库时,完全相同的代码会捕获异常,并且记录异常的代码将执行。 (我证实了这一内VS看会发生同样的情况。)
这里是正在执行的伪代码:
所以我有两个问题:
有一些变化在第三方可能编译库的方式,以便我的代码将无法捕捉异常? (是的,如果我知道要告诉他们什么,我可以让第三方为我做出必要的修复和重新编译。)
假设我无法让第三方修复它,我能做些什么来抓住这些例外情况?我正在考虑...有没有办法让我确定pObject是否被释放了?
哇这是一篇非常有用的文章,实际上对我来说确实包含一个可行的解决方案......旧的库必须在VS2003下构建,而新的库适用于VS2008--这是至关重要的区别。将我的库设置为编译w /选项“启用C++异常:是有SEH异常(/ EHa)”我的代码现在捕获此实例。出于这个原因,我正在授予这个答复的正确答案。 但是我想说的是,其他几个答案提供了有效的有用信息,特别是关于“在继续使用中没有多大用处”的答案,所以谢谢大家! – 2009-09-03 14:46:26
用C++ try/catch捕捉SEH异常通常是一个糟糕的主意。 MS为什么在新编译器中默认禁用它是有原因的。通常,您应该使用SEH构造(如__try/__ except),而不是启用该编译器选项。 – jalf 2009-09-03 15:11:25
Michael Bray>没问题,我想这里有很多答案可以帮助解决这类问题。我也会投票给其他人,以便在这个答案下做出决定。 jalf>确实。这就是他们在文章中所做的。 – Klaim 2009-09-03 16:16:58