2012-04-06 44 views
2

呼叫PyErr_Set*可以安全地覆盖异常吗?根据文档,如果出现错误,PySequence_Fast会提供一个TypeError以及提供给它的const char *消息参数。 PySequence_Fast发生错误后拨打PyErr_SetObject是否安全?PyErr_Set *两次

实施例:

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

    // ... 
} 

回答

1

据 “的Python/errors.c” 从Python 2.7.2源代码,PyErr_SetObject()呼叫PyErr_Restore()其中Py_XDECREF()小号任何旧的异常状态变量设置新的之前。所以是的,覆盖现有的异常是安全的。只要知道你完全覆盖了以前的异常。