0

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

1 回答 1

0

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

于 2013-05-07T23:18:12.450 回答