2012-04-06 9 views
2

Ist es sicher, PyErr_Set* aufzurufen, um eine Ausnahme zu überschreiben? Laut der Dokumentation löst PySequence_Fast einen TypeError mit dem Nachrichtenargument const char * aus, das ihm bei einem Fehler übergeben wird. Wäre es sicher, PyErr_SetObject zu rufen, nachdem PySequence_Fast einen Fehler verursacht?PyErr_Set * zweimal

Beispiel:

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

    // ... 
} 

Antwort

1

Laut "Python/errors.c" aus dem Python 2.7.2-Quellcode, PyErr_SetObject() Anrufe PyErr_Restore() das Py_XDECREF() s alle alte Ausnahmezustandsvariablen, bevor die neue Einstellung. Ja, es ist sicher, eine bestehende Ausnahme zu überschreiben. Beachten Sie jedoch, dass Sie die vorherige Ausnahme vollständig außer Kraft setzen.