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

Ste*_*end 7 c++ java java-native-interface swig exception-handling

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

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

And*_*mas 8

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

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

WRAP_THROW_EXCEPTION( myCppDeclaration, com::foo::MyCppExceptionClass, 
  "com.foo.MyException",
  "com/foo/MyException" );
Run Code Online (Sandbox Code Playgroud)

这是宏:

%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
Run Code Online (Sandbox Code Playgroud)


whe*_*ies 5

由于我一直在努力解决这个问题(请从我的个人资料中查看我的博客,它是关于 python、SWIG、例外和董事的内容,但应该会有所帮助),让我给您一些建议:

  1. 不要将 C++ 异常发送到 Java 堆栈。它会让你的应用程序崩溃。确保它们都以正确的方式包裹。我知道您在问这个问题,但您确实有必要了解这一点。一个错过的异常就可以解决所有问题。
  2. 不要尝试将 Java 异常传递到 C++ 堆栈,它们会转换为 SWIGDirectorExceptions 或 SWIGMethodExceptions。这确实很痛苦,因为您丢失了 Java 异常的类型信息。相反,如果您不与主管打交道,请创建一个 C++ 类,它只会引发 C++ 异常,以便您可以沿着 C++ 堆栈传播 C++ 异常。
  3. 将从 Java 传递到 C++ 的所有裸字符串包装在 std::string 中。如果将它们保留为const char指针,Java 将可以选择对它们进行垃圾收集。所有项目都是如此,但它是一个很容易被忽视的项目,我已经做过并且已经看到它做过几次了。

之后就不要再读1.1了。使用 2.0 或 1.3 中的文档。这更清楚了。