Mercurial > cpython-lru_cache-weakref
diff Python/errors.c @ 85415:e63f19d0a651
Issue #18664, #18408: Rewrite PyErr_WriteUnraisable() to handle errors
* Catch PyFile_WriteString() and PyFile_WriteObject() errors
* Clear the current exception on _PyObject_GetAttrId() failure
* Use PyUnicode_CompareWithASCIIString() and PyFile_WriteObject() instead of
_PyUnicode_AsString() and strcmp() to avoid Unicode encoding error. stderr
has a more tolerant error handler than utf-8/strict.
| author | Victor Stinner <vstinner@wyplay.com> |
|---|---|
| date | Mon, 26 Aug 2013 14:04:10 +0200 |
| parents | 9b77b3ee6fb8 |
| children | df2fdd42b375 |
line wrap: on
line diff
--- a/Python/errors.c Mon Aug 26 13:49:06 2013 +0200 +++ b/Python/errors.c Mon Aug 26 14:04:10 2013 +0200 @@ -825,54 +825,76 @@ { _Py_IDENTIFIER(__module__); PyObject *f, *t, *v, *tb; + PyObject *moduleName = NULL; + char* className; + PyErr_Fetch(&t, &v, &tb); + f = PySys_GetObject("stderr"); - if (f != NULL && f != Py_None) { - if (obj) { - PyFile_WriteString("Exception ignored in: ", f); - PyFile_WriteObject(obj, f, 0); - PyFile_WriteString("\n", f); - } - PyTraceBack_Print(tb, f); - if (t) { - PyObject* moduleName; - char* className; - assert(PyExceptionClass_Check(t)); - className = PyExceptionClass_Name(t); - if (className != NULL) { - char *dot = strrchr(className, '.'); - if (dot != NULL) - className = dot+1; - } + if (f == NULL || f == Py_None) + goto done; + + if (obj) { + if (PyFile_WriteString("Exception ignored in: ", f) < 0) + goto done; + if (PyFile_WriteObject(obj, f, 0) < 0) + goto done; + if (PyFile_WriteString("\n", f) < 0) + goto done; + } + + if (PyTraceBack_Print(tb, f) < 0) + goto done; + + if (!t) + goto done; + + assert(PyExceptionClass_Check(t)); + className = PyExceptionClass_Name(t); + if (className != NULL) { + char *dot = strrchr(className, '.'); + if (dot != NULL) + className = dot+1; + } - moduleName = _PyObject_GetAttrId(t, &PyId___module__); - if (moduleName == NULL) - PyFile_WriteString("<unknown>", f); - else { - char* modstr = _PyUnicode_AsString(moduleName); - if (modstr && - strcmp(modstr, "builtins") != 0) - { - PyFile_WriteString(modstr, f); - PyFile_WriteString(".", f); - } - } - if (className == NULL) - PyFile_WriteString("<unknown>", f); - else - PyFile_WriteString(className, f); - if (v && v != Py_None) { - PyFile_WriteString(": ", f); - PyFile_WriteObject(v, f, Py_PRINT_RAW); - } - PyFile_WriteString("\n", f); - Py_XDECREF(moduleName); + moduleName = _PyObject_GetAttrId(t, &PyId___module__); + if (moduleName == NULL) { + PyErr_Clear(); + if (PyFile_WriteString("<unknown>", f) < 0) + goto done; + } + else { + if (PyUnicode_CompareWithASCIIString(moduleName, "builtins") != 0) { + if (PyFile_WriteObject(moduleName, f, Py_PRINT_RAW) < 0) + goto done; + if (PyFile_WriteString(".", f) < 0) + goto done; } - PyErr_Clear(); /* Just in case */ + } + if (className == NULL) { + if (PyFile_WriteString("<unknown>", f) < 0) + goto done; + } + else { + if (PyFile_WriteString(className, f) < 0) + goto done; } + + if (v && v != Py_None) { + if (PyFile_WriteString(": ", f) < 0) + goto done; + if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) + goto done; + } + if (PyFile_WriteString("\n", f) < 0) + goto done; + +done: + Py_XDECREF(moduleName); Py_XDECREF(t); Py_XDECREF(v); Py_XDECREF(tb); + PyErr_Clear(); /* Just in case */ } extern PyObject *PyModule_GetWarningsModule(void);
