如何处理从C ++通过SWIG到Java的exception

我们正在实现一个关于C ++代码的包装器,以便接触Java客户端。 我已经看到了关于exception处理的SWIG文档,但这在三层(C ++ / SWIG / Java)中的编码术语中转化了什么?

如果有人有工作实例或建议,我将不胜感激。

因为我已经和我搏斗了(从我的个人资料中查看我的博客,它是关于python,SWIG,exception和导演但应该有帮助)让我给你一些建议:

  1. 不要将C ++exception发送到Java堆栈。 它会使你的应用程序崩溃。 确保它们都以正确的方式包裹。 我知道你在问这个问题,但是你必须明白这一点。一个错过的例外就可以解决这个问题。
  2. 不要尝试将Javaexception传递给C ++堆栈,它们会转换为SWIGDirectorExceptions或SWIGMethodExceptions。 这是一个真正的痛苦,因为您丢失了Javaexception的类型信息。 相反,如果你不是在处理一个导演,那么创建一个C ++类除了引发C ++exception之外什么也不做,这样你就可以在C ++栈中传播C ++exception。
  3. 在std :: string中包装从Java传递给C ++的所有裸字符串。 如果将它们保存为const char指针,Java将具有垃圾收集它们的选项。 这对所有项目都是如此,但它是一个容易被忽视的项目,我已经完成了它并且已经看过它已经完成了几次。

之后,请不要阅读1.1。 使用2.0或1.3中的文档。 它更清楚了。

另请参阅Swig 2.0文档中有关exception处理的特定于Java的部分 。

为了避免多次编写模式,我创建了一个SWIG宏,支持抛出一种类型的C ++exception的方法 – 通过捕获它并抛出相应的Javaexception:

 WRAP_THROW_EXCEPTION( myCppDeclaration, com::foo::MyCppExceptionClass, "com.foo.MyException", "com/foo/MyException" ); 

这是宏:

 %define WRAP_THROW_EXCEPTION( MATCH, CPPTYPE, JTYPE, JNITYPE ) %javaexception(JTYPE) MATCH { try { $action } catch ( CPPTYPE & e ) { jclass eclass = jenv->FindClass(JNITYPE); if ( eclass ) { jenv->ThrowNew( eclass, e.what() ); } } } %enddef