2011-06-06 60 views
0

我正在编译我的程序与第三方库。如果内部发生错误,该库包含错误回调。在那个错误回调里面,我抛出了一个异常,并且我有一个单元测试来验证当我做了什么无效的异常抛出。这一切都在Windows中运行得很好,但是当我在linux(fedora)中测试这个时,我得到了一个未捕获的异常中止。从第三方静态库的回调中未捕获的异常

我试着用try-catch块直接打包我的电话,但没有运气。 (另外,我所有的代码都在谷歌测试框架中运行,通常也捕获异常)。似乎捕捉异常的唯一情况是,如果我将throw语句直接包含在错误回调中的try块中。

有没有人有任何想法,为什么会发生这种情况,如果有办法赶上例外?

回答

3

当你interface with third-party libraries你通常必须抓住你的代码和他们的代码之间的边界所有的异常:

int yourCallback(params) 
{ 
    try { 
     doStuff(params); 
     return Okay; 
    } catch (...) { 
     return Error; 
    } 
} 

的原因是,你不能肯定该库是用C++或者它使用与代码使用的C++运行时版本非常相同。

除非您完全确定代码可以处理您的异常,否则您不能将异常传播到第三方代码。最极端的例子就是COM,你的代码和“其他代码”可以用任何语言和任何运行时,并且你不允许异常通过COM边界传播。

+0

好的答案,'+ 1'! – sbi 2011-06-06 14:40:16

+0

感谢您的回答,这是有道理的。 – drewag 2011-06-06 14:54:40

1

通常你不应该抛出你不知道任何关于“通过”代码的异常。它可能是C代码,它甚至不会自行清理。

如何处理您的具体问题需要有关您正与之连接的第三方库的具体信息。那里有什么回调?给你一个修理东西的机会?通知您发生了错误?你可以取消它被调用的任何操作吗?
处理这种情况的一种方法是在调用回调时在某处存储某些信息,并在实际处理从调用该库的函数结束时检查该信息。

+0

我认为这几乎肯定是问题所在。它是一个C库。不过,我想我只是困惑为什么Windows可以处理它,而Linux不? – drewag 2011-06-06 14:37:44

+0

@drewarg:不管什么原因,你不应该依赖它 - 请花时间阅读我链接到的问题的答案。 – sharptooth 2011-06-06 14:38:53

+0

@drewag:我不知道。但是通过C代码抛出C++异常很可能会调用未定义的行为,所以无论发生什么都是“正确的”。 – sbi 2011-06-06 14:39:40