2

调用PyErr_Set*覆盖异常是否安全?根据文档,如果出现错误,则使用提供给它的message 参数PySequence_Fast引发 a 。引发错误后调用是否安全?TypeErrorconst char *PyErr_SetObjectPySequence_Fast

例子:

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;
    }

    // ...
}
4

1 回答 1

1

根据 Python 2.7.2 源代码中的“Python/errors.c”,在设置新异常状态变量之前PyErr_SetObject()调用PyErr_Restore()which Py_XDECREF()s 任何旧异常状态变量。所以是的,覆盖现有异常是安全的。请注意,您完全覆盖了先前的异常。

于 2012-04-12T16:42:29.677 回答