[issue6284] C/API PyErr_AsUnicode()
STINNER Victor
report at bugs.python.org
Fri Jan 7 23:40:42 CET 2011
STINNER Victor <victor.stinner at haypocalc.com> added the comment:
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
+
+ PyErr_Clear();
I think that the call to PyErr_Clear() is useless, PyErr_Fetch() already cleared the exception.
+ /* clear the error */
+ PyErr_Restore(error_type, error_value, error_traceback);
+ PyErr_Clear();
Why do you restore the error if you clear it directly? I think that at this position, there is no current exception. So it may be simplified as:
Py_DECREF(error_type);
Py_DECREF(error_value);
Py_DECREF(error_traceback);
I suppose here that all these 3 variables are not NULL.
+ if(! (string_io_mod= PyImport_ImportModule("io")) ) {
+ PyErr_Clear();
+ return NULL;
+ }
+ else if (! (string_io= PyObject_CallMethod(string_io_mod, "StringIO", NULL))) {
+ PyErr_Clear();
+ Py_DECREF(string_io_mod);
+ return NULL;
+ }
+ else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
+ PyErr_Clear();
+ Py_DECREF(string_io_mod);
+ Py_DECREF(string_io);
+ return NULL;
+ }
Minor style remark: you can remove the "else" keywords here.
You should factorize the error handling at the end using "goto error;" with a error handler looking like:
------------
...
goto finally;
error:
PyErr_Clear();
Py_CLEAR(stringio_buf);
finally:
Py_XDECREF(string_io_mod);
Py_XDECREF(string_io);
Py_XDECREF(string_io_getvalue);
return NULL;
------------
In my opinion, it's easier to maintain it, and more readable.
----------
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue6284>
_______________________________________
More information about the Python-bugs-list
mailing list