0

我正在使用 SWIG 将 C++ 库包装到 Java 和 Python 中。Java 端工作正常,但我在将代码包装到 Python 中时遇到问题,特别是当引发 IO 异常时,我在 python 中得到以下信息:

...
RuntimeError: _408aad4bde7f0000_p_std__ios_base__failure
swig/python detected a memory leak of type 'std::ios_base::failure *', no destructor found.

这是我的 .i 文件中的相关位置:

%include "exception.i"
#include <stdexcept>
#include <ios>
#include <iostream>
%exception {
    try {
        $action
    } catch (const std::exception &e) {
        PyErr_SetString(PyExc_Exception, const_cast<char*>(e.what()));
    }
    catch(std::ios_base::failure &e) {
        PyErr_SetString(PyExc_IOError, const_cast<char*>(e.what()));
    }
}

有任何想法吗?对于它的价值,io 异常在使用库的本机 C++ 和 SWIG 包装的 Java 中都按预期工作。

4

1 回答 1

0

答案可能为时已晚,但是您应该像这样包装异常

// http://www.swig.org/Doc1.3/Library.html#Library_stl_exceptions
%exception {
  try {
    $action
  } catch (const std::exception& e) {
    SWIG_exception(SWIG_RuntimeError, e.what());
  }
}

这也可以跨语言移植,您不需要对 Java 和 Python 进行单独的异常处理。

于 2017-11-02T02:02:55.467 回答