2012-04-06 11 views
2

例外を無効にするにはPyErr_Set*に電話をかけても安全ですか?ドキュメントによれば、PySequence_Fastは、エラーがある場合にconst char *メッセージ引数が与えられたTypeErrorを発生させます。 PySequence_Fastの後にPyErr_SetObjectに電話するのが安全でしょうか?エラーが発生しましたか?PyErr_Set * twice

例:

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

新しいものを設定する前にPyErr_Restore()Py_XDECREF()の古い例外状態変数を呼び出しPyErr_SetObject()のPython 2.7.2のソースコードから、 "パイソン/ errors.c" によります。したがって、既存の例外をオーバーライドすることは安全です。前の例外を完全に上書きしていることに注意してください。

関連する問題