SWIG(python)包装器忽略了%异常?

时间:2013-12-20 09:27:39

标签: python c swig

我正在尝试使用SWIG将C lib包装到python mod,但是我无法使异常工作。这是代码的一个小例子,

except_test.i

%module except_test
%{
#include "except_test.h"
#include <stdio.h>
%}

%include "except_test.h"

%{
static int flagged_exception = 0;

void throw_except()
{
    flagged_exception = 1;
}
%}

%exception {
    $action
    if (flagged_exception) {
        PyErr_SetString(PyExc_RuntimeError, "test except");
        flagged_exception = 0;
    }
}

except_test.c:

int except_test(int a) {

    if (a < 0) {
        throw_except();
        return 0;
    } else{
        return -1;
    }
}

然后当我运行except_test()函数时,不抛出异常

run_except.py

from except_test import *

b = except_test(-1)
print 'b=', b

生成

$ python run_except.py 
b= 0
$

这里有什么问题?

1 个答案:

答案 0 :(得分:2)

在处理%exception标头之前声明except_test.h;否则,当函数包含在SWIG中时,它将不会处于活动状态:

%module except_test
%{
#include "except_test.h"
#include <stdio.h>
%}

%exception {
    $action
    if (flagged_exception) {
        PyErr_SetString(PyExc_RuntimeError, "test except");
        flagged_exception = 0;
        return NULL; // ** need to add this **
    }
}

%include "except_test.h"

%{
static int flagged_exception = 0;

void throw_except()
{
    flagged_exception = 1;
}
%}

结果:

>>> import except_test
>>> except_test.except_test(-1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: test except