使用SWIG对java进行类型映射的异常,仍未捕获

时间:2013-05-07 22:36:04

标签: java c++ swig

我正在尝试使用SWIG将一些C ++代码包装到java中。代码一般工作,现在我正在处理错误处理。 C ++代码抛出了几种类型的异常。我已经浏览了所有C ++代码并将throw(...)添加到函数标题中,并将其添加到我的SWIG .i文件中:

%include "exception.i"
%typemap(throws, throws="java.io.IOException") std::ios_base::failure {
  jclass excep = jenv->FindClass("java/io/IOException");
  if (excep)
    jenv->ThrowNew(excep, $1.what());
  return $null;
}
%typemap(javabase) std::ios_base::failure "java.lang.Exception";
%typemap(throws, throws="java.lang.IllegalArgumentException") std::invalid_argument {
  jclass excep = jenv->FindClass("java/lang/IllegalArgumentException");
  if (excep)
    jenv->ThrowNew(excep, $1.what());
  return $null;
}
%typemap(javabase) std::invalid_argument "java.lang.Exception";

当我查看生成的java文件时,它们似乎都正确完成,即应该在java中引发异常的函数使用throws指定...但是,当我运行代码并执行命令时在C ++方面生成一个异常,它不被包装器捕获,我得到:

libc++abi.dylib: terminate called throwing an exception
Abort trap: 6

1 个答案:

答案 0 :(得分:0)

好的,我明白这一点。当然,这是我的错。出于某种原因,在C ++代码中,我决定通过指针抛出异常,即throw new ...,当我应该按照SWIG代码所期望的throw ...引用时抛出异常。改变了,它现在按预期工作。