2009-09-03 75 views
14

我有一个第三方库有时会抛出一个异常。所以我决定换我的代码在一个try/catch(...),这样我可以记录有关发生的异常信息(无具体细节,只是它发生了。)无法捕捉C++异常使用catch(...)

但由于某些原因,该代码仍然崩溃。在客户端计算机上,它崩溃并且在catch(...)中记录异常的代码从未得到执行。如果我在我的调试/开发机器上运行这个,我会弹出一个询问我是否需要调试的问题。当我这样做时,它会报告0xC0000005:访问冲突读取位置XXX。

奇怪的是,使用旧版本的第三方库时,完全相同的代码会捕获异常,并且记录异常的代码将执行。 (我证实了这一内VS看会发生同样的情况。)

这里是正在执行的伪代码:

所以我有两个问题:

  1. 有一些变化在第三方可能编译库的方式,以便我的代码将无法捕捉异常? (是的,如果我知道要告诉他们什么,我可以让第三方为我做出必要的修复和重新编译。)

  2. 假设我无法让第三方修复它,我能做些什么来抓住这些例外情况?我正在考虑...有没有办法让我确定pObject是否被释放了?

回答

11

AFAIK访问冲突不会抛出异常......至少不是标准的!

也许捕捉特定Windows的“原生”的异常将有助于:http://www.gamedev.net/reference/articles/article2488.asp

+0

哇这是一篇非常有用的文章,实际上对我来说确实包含一个可行的解决方案......旧的库必须在VS2003下构建,而新的库适用于VS2008--这是至关重要的区别。将我的库设置为编译w /选项“启用C++异常:是有SEH异常(/ EHa)”我的代码现在捕获此实例。出于这个原因,我正在授予这个答复的正确答案。 但是我想说的是,其他几个答案提供了有效的有用信息,特别是关于“在继续使用中没有多大用处”的答案,所以谢谢大家! – 2009-09-03 14:46:26

+4

用C++ try/catch捕捉SEH异常通常是一个糟糕的主意。 MS为什么在新编译器中默认禁用它是有原因的。通常,您应该使用SEH构造(如__try/__ except),而不是启用该编译器选项。 – jalf 2009-09-03 15:11:25

+0

Michael Bray>没问题,我想这里有很多答案可以帮助解决这类问题。我也会投票给其他人,以便在这个答案下做出决定。 jalf>确实。这就是他们在文章中所做的。 – Klaim 2009-09-03 16:16:58

0

你描述的看起来非常像::结束()是由C++运行时调用。

这通常是由所谓的双重例外引起的 - 某处引发异常,堆栈展开开始,并且在堆栈展开期间调用的析构函数之一也引发异常。在这种情况下:: terminate()被调用,你不能真正帮助程序。

如果是这种情况,唯一的解决办法是获取库的新版本,其中异常不会在析构函数外发生。你可以很容易地验证 - 库已经加载电话:: set_terminate(后),并提供自己的函数,并检查其是否被之前的程序崩溃调用。

1

如果你是Windows平台上,你可以尝试寻找__try

上。然而,请注意,没有,除非你真的确定你可以隔离和处理异常继续执行多大用处。

8

访问冲突是不是一个C++异常。这是一个Windows结构化异常。如果你想捕捉它们(...),你必须使用_set_se_translator()。

你或许应该谷歌的所有原因,赶上(...)是邪恶的,并确保你真的想这样做。

+0

这是一个很好的信息......但在我的情况下,似乎我必须在main()函数中使用_set_se_translator()(至少根据上面sharptooth引用的文章中的示例).. 。我没有提到的一件事是,我的代码实际上是另一个应用程序(第三方应用程序,实际上)加载的com对象,我无法控制正在使用的main()。否则,我认为这将是最好的道路。 – 2009-09-03 14:48:50

+0

Ooops我的意思是Klaim在文章中的参考。抱歉! – 2009-09-03 14:49:52