Mercurial > cpython-lru_cache-weakref
diff Python/errors.c @ 14330:6dee1985c681 legacy-trunk
refactor __del__ exception handler into PyErr_WriteUnraisable
add sanity check to gc: if an exception occurs during GC, call
PyErr_WriteUnraisable and then call Py_FatalEror.
| author | Jeremy Hylton <jeremy@alum.mit.edu> |
|---|---|
| date | Fri, 01 Sep 2000 02:47:25 +0000 |
| parents | 019265b3a856 |
| children | 951eb3af3494 |
line wrap: on
line diff
--- a/Python/errors.c Fri Sep 01 02:43:38 2000 +0000 +++ b/Python/errors.c Fri Sep 01 02:47:25 2000 +0000 @@ -450,3 +450,30 @@ Py_XDECREF(modulename); return result; } + +/* Call when an exception has occurred but there is no way for Python + to handle it. Examples: exception in __del__ or during GC. */ +void +PyErr_WriteUnraisable(PyObject *obj) +{ + PyObject *f, *t, *v, *tb; + PyErr_Fetch(&t, &v, &tb); + f = PySys_GetObject("stderr"); + if (f != NULL) { + PyFile_WriteString("Exception ", f); + if (t) { + PyFile_WriteObject(t, f, Py_PRINT_RAW); + if (v && v != Py_None) { + PyFile_WriteString(": ", f); + PyFile_WriteObject(v, f, 0); + } + } + PyFile_WriteString(" in ", f); + PyFile_WriteObject(obj, f, 0); + PyFile_WriteString(" ignored\n", f); + PyErr_Clear(); /* Just in case */ + } + Py_XDECREF(t); + Py_XDECREF(v); + Py_XDECREF(tb); +}
