Python Pyrr_集*两次

Python Pyrr_集*两次,python,c,exception,python-c-extension,Python,C,Exception,Python C Extension,调用PyErr\u Set*覆盖异常是否安全?根据文档,如果出现错误,则使用提供给它的const char*消息参数引发TypeError。在PySequence\u Fast引发错误后调用PyErr\u SetObject是否安全 例如: static PyObject * myfunc(PyObject * self, PyObject * args) { PyObject * pyobj; PyObject * pyseq; PyObject * message;

调用
PyErr\u Set*
覆盖异常是否安全?根据文档,如果出现错误,则使用提供给它的
const char*
消息参数引发
TypeError
。在
PySequence\u Fast
引发错误后调用
PyErr\u 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;
    }

    // ...
}
根据Python2.7.2源代码中的“Python/errors.c,
PyErr\u SetObject()
调用
PyErr\u Restore()
which
Py\u XDECREF()
s在设置新的异常状态变量之前,会先删除所有旧的异常状态变量。因此,覆盖现有异常是安全的。请注意,您正在完全覆盖前面的异常