【问题标题】:SWIG: Reporting Python exceptions from C++ codeSWIG:从 C++ 代码报告 Python 异常
【发布时间】:2011-06-16 05:43:37
【问题描述】:

我正在使用一个库,它在其 API 文档中指定定义一个从库的某个特定类继承的类。该库本身是用 C++ 编写的,与 Python 的绑定是使用 SWIG 生成的。问题是,当我运行我的 Python 代码时,无论 Python 抛出什么异常,我都会收到错误消息“在抛出 'Swig::DirectorMethodException' 的实例后调用终止”。

我希望在执行我的程序时报告 Python 代码引发的这个异常。特别是那些我得到 ZeroDivisionError 的情况。

我尝试按照http://www.swig.org/Doc2.0/Python.html#Python_nn36 的 SWIG 文档中描述的方法进行一些破解,但没有运气。无论我在 module.i 文件中放入什么内容,我仍然会收到相同的消息“在抛出 'Swig::DirectorMethodException' 的实例后调用终止”。

有人可以指点我如何解决这个问题,以便按原样报告 Python 异常吗?

【问题讨论】:

    标签: c++ python exception swig


    【解决方案1】:

    在程序的控制台中报告 Python 引发的异常。

    这是来自 Madhusudan.C.S 的有用修复。 请参阅他对 ginbot 答案的评论。 我将其作为答案,以便它变得更加明显。

    /* MyInterface.i */
    %module(directors="1") MyInterface
    %feature("director:except") {
        if( $error != NULL ) {
            PyObject *ptype, *pvalue, *ptraceback;
            PyErr_Fetch( &ptype, &pvalue, &ptraceback );
            PyErr_Restore( ptype, pvalue, ptraceback );
            PyErr_Print();
            Py_Exit(1);
        }
    } 
    

    【讨论】:

      【解决方案2】:

      我不知道你的代码库已经走了多远,所以这可能没什么用,但我使用 boost::python 比使用 SWIG 运气好强>。然后你可以这样做:boost::python Export Custom Exception

      【讨论】:

      • 感谢您的帮助。我实际上解决了这个问题,解决方法在这里:github.com/madhusudancs/mesos/commit/… 这很简单,但肯定没有很好的记录。另外,这不是我的项目,所以我只能建议开发人员使用 boost::python,但我无法实现它
      • 我认为 SWIG 是强制性的;我想把提升选项留给像我这样偶然发现这个问题的人:)。现在他们也有了 SWIG。
      猜你喜欢
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多