Python/C 异常的问题
我在将python嵌入到C里面遇到一个这样的问题。我定义了一个PythonNode的新类型,这是一个C++中的树结构
我在定义PythonNode的成员函数,这个函数的参数是一个回调函数,代码如下:
PyObject* PythonNode::Node_enumerateChildren(NodeObject* self, PyObject* args)
{
PyObject* visitor;
if (!PyArg_ParseTuple(args, "O", &visitor))
return NULL;
try
{
self->node.enumerateChildren([visitor](Node child)
{
NodeObject* childNode = (NodeObject*)NodeType.tp_alloc(&NodeType, 0);
childNode->node = child;
PyObject_CallFunction(visitor, "O", childNode);
if (PyErr_Occurred())
{
//PyErr_Clear();
throw BreakHere();
}
});
}
catch (BreakHere){}
Py_RETURN_NONE;
}
而在python中调用enumerate_children需要写一个回调函数如下:
class BreakHere(BaseException):
pass
find_node = None
def find_one(child):
find_node = child
raise Break_Here() #这个是我自定义的异常
try:
node.enumerate_children(find_one)
except Break_Here:
pass
整个的调用流程是,python中会调用enumerate_children,而这个函数的实现在C中,
而C中enumerate_children的具体实现是一个遍历,遍历的过程中逐个的调用python中的设置回调函数find_one。
而find_one会抛出异常,我希望当其抛出异常时中断所有的操作,捕捉我想要的一个结果。
但事实上python的try-except没有起到任何作用,因为在调用enumerate_children直接会报错,提示这个函数返回的是一个error set。
请问有没有大神能够解决这个问题