Commit a85a1d33 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-36829: sys.excepthook and sys.unraisablehook flush (GH-13620)

sys.excepthook() and sys.unraisablehook() now explicitly flush the
file (usually sys.stderr).

If file.flush() fails, sys.excepthook() silently ignores the error,
whereas sys.unraisablehook() logs the new exception.
parent 51ddab8d
......@@ -26,6 +26,7 @@ extern "C" {
_Py_IDENTIFIER(builtins);
_Py_IDENTIFIER(stderr);
_Py_IDENTIFIER(flush);
/* Forward declarations */
......@@ -1254,6 +1255,14 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type,
if (PyFile_WriteString("\n", file) < 0) {
return -1;
}
/* Explicitly call file.flush() */
PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL);
if (!res) {
return -1;
}
Py_DECREF(res);
return 0;
}
......
......@@ -978,6 +978,16 @@ _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *t
}
print_exception_recursive(file, value, seen);
Py_XDECREF(seen);
/* Call file.flush() */
PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL);
if (!res) {
/* Silently ignore file.flush() error */
PyErr_Clear();
}
else {
Py_DECREF(res);
}
}
void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment