繁体   English   中英

如何通过SWIG到Java处理C ++中的异常

[英]How to handle exceptions from C++ via SWIG to Java

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM