我正在尝试使用 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