]> granicus.if.org Git - python/commitdiff
When an unhandled exception happens, report the repr() of the function
authorGuido van Rossum <guido@python.org>
Tue, 29 Apr 2003 19:44:05 +0000 (19:44 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 29 Apr 2003 19:44:05 +0000 (19:44 +0000)
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()).

Modules/threadmodule.c

index 62fd76ada340ba8d6102236c5aed920531268e9d..8b174b3af538f09b0123dc24d5970b8a39e65f6b 100644 (file)
@@ -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();