我正在尝试使用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
$
这里有什么问题?
答案 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