When an unhandled exception happens, report the repr() of the function
that was used to start the thread. This is useful to track down the source of the problem when there is no traceback, as can happen when a daemon thread gets to run after Python is finialized (a new kind of event, somehow this is now possible due to changes in Py_Finalize()).
This commit is contained in:
parent
c689918c94
commit
24ccca1565
|
@ -179,20 +179,28 @@ t_bootstrap(void *boot_raw)
|
|||
PyEval_AcquireThread(tstate);
|
||||
res = PyEval_CallObjectWithKeywords(
|
||||
boot->func, boot->args, boot->keyw);
|
||||
Py_DECREF(boot->func);
|
||||
Py_DECREF(boot->args);
|
||||
Py_XDECREF(boot->keyw);
|
||||
PyMem_DEL(boot_raw);
|
||||
if (res == NULL) {
|
||||
if (PyErr_ExceptionMatches(PyExc_SystemExit))
|
||||
PyErr_Clear();
|
||||
else {
|
||||
PySys_WriteStderr("Unhandled exception in thread:\n");
|
||||
PyObject *file;
|
||||
PySys_WriteStderr(
|
||||
"Unhandled exception in thread started by ");
|
||||
file = PySys_GetObject("stderr");
|
||||
if (file)
|
||||
PyFile_WriteObject(boot->func, file, 0);
|
||||
else
|
||||
PyObject_Print(boot->func, stderr, 0);
|
||||
PySys_WriteStderr("\n");
|
||||
PyErr_PrintEx(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
Py_DECREF(res);
|
||||
Py_DECREF(boot->func);
|
||||
Py_DECREF(boot->args);
|
||||
Py_XDECREF(boot->keyw);
|
||||
PyMem_DEL(boot_raw);
|
||||
PyThreadState_Clear(tstate);
|
||||
PyThreadState_DeleteCurrent();
|
||||
PyThread_exit_thread();
|
||||
|
|
Loading…
Reference in New Issue