调用 PyErr_Set*
覆盖异常是否安全?根据文档,PySequence_Fast
如果有错误,则使用提供给它的 const char *
消息参数引发 TypeError
。在 PySequence_Fast
引发错误后调用 PyErr_SetObject
是否安全?
例子:
static PyObject * myfunc(PyObject * self, PyObject * args) {
PyObject * pyobj;
PyObject * pyseq;
PyObject * message;
if (!PyArg_ParseTuple(args, "O", &pyobj)) {
return NULL;
}
pyseq = PySequence_Fast(pyobj, "");
if (pyseq == NULL) {
message = PyString_FromFormat("argument is a '%s', not a sequence.", pyobj->ob_type->tp_name);
PyErr_SetObject(PyExc_TypeError, message);
Py_XDECREF(message);
return NULL;
}
// ...
}
根据 Python 2.7.2 源代码中的“Python/errors.c”,PyErr_SetObject()
调用 PyErr_Restore()
其中 Py_XDECREF()
在设置新的异常状态变量之前设置任何旧的异常状态变量。所以是的,覆盖现有异常是安全的。请注意,您正在完全覆盖之前的异常。
我是一名优秀的程序员,十分优秀!