]> granicus.if.org Git - python/commitdiff
Issue #7317: Display full tracebacks when an error occurs asynchronously.
authorAndrew Svetlov <andrew.svetlov@gmail.com>
Sat, 3 Nov 2012 13:56:05 +0000 (15:56 +0200)
committerAndrew Svetlov <andrew.svetlov@gmail.com>
Sat, 3 Nov 2012 13:56:05 +0000 (15:56 +0200)
  Patch by Alon Horev with update by Alexey Kachayev.

Lib/test/test_cmd_line.py
Lib/test/test_generators.py
Misc/NEWS
Python/errors.c

index cbe1e5545d647a5012efaf9d4374fcf83bc1152f..4b39115de80501a7d62ed2e35d42370e3308407b 100644 (file)
@@ -310,7 +310,7 @@ class CmdLineTest(unittest.TestCase):
         rc, out, err = assert_python_ok('-c', code)
         self.assertEqual(b'', out)
         self.assertRegex(err.decode('ascii', 'ignore'),
-                         'Exception OSError: .* ignored')
+                         'Exception ignored in.*\nOSError: .*')
 
     def test_closed_stdout(self):
         # Issue #13444: if stdout has been explicitly closed, we should
index 06f67c2ea6918b80e874def131ce4f621052871c..f5c1a7d80c97d09b9e53bb14840fae1821d6009b 100644 (file)
@@ -1728,9 +1728,7 @@ Our ill-behaved code should be invoked during GC:
 >>> g = f()
 >>> next(g)
 >>> del g
->>> sys.stderr.getvalue().startswith(
-...     "Exception RuntimeError: 'generator ignored GeneratorExit' in "
-... )
+>>> "RuntimeError: generator ignored GeneratorExit" in sys.stderr.getvalue()
 True
 >>> sys.stderr = old
 
@@ -1840,22 +1838,23 @@ to test.
 ...     sys.stderr = io.StringIO()
 ...     class Leaker:
 ...         def __del__(self):
-...             raise RuntimeError
+...             def invoke(message):
+...                 raise RuntimeError(message)
+...             invoke("test")
 ...
 ...     l = Leaker()
 ...     del l
 ...     err = sys.stderr.getvalue().strip()
-...     err.startswith(
-...         "Exception RuntimeError: RuntimeError() in <"
-...     )
-...     err.endswith("> ignored")
-...     len(err.splitlines())
+...     "Exception ignored in" in err
+...     "RuntimeError: test" in err
+...     "Traceback" in err
+...     "in invoke" in err
 ... finally:
 ...     sys.stderr = old
 True
 True
-1
-
+True
+True
 
 
 These refleak tests should perhaps be in a testfile of their own,
index 5ca7e4df6ae36fb622468ac68f8526d0b2521b78..5cbf5feab1daf95bae570e6ab704db61c2b16835 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1?
 Core and Builtins
 -----------------
 
+- Issue #7317: Display full tracebacks when an error occurs asynchronously.
+  Patch by Alon Horev with update by Alexey Kachayev.
+
 - Issue #16309: Make PYTHONPATH="" behavior the same as if PYTHONPATH
   not set at all.
 
index 626b16e46fe7ab3bb0cb062b3796c0c4c71685a2..a2d1a82ddf222012d778206e0995c62c7ba9b1af 100644 (file)
@@ -798,7 +798,12 @@ PyErr_WriteUnraisable(PyObject *obj)
     PyErr_Fetch(&t, &v, &tb);
     f = PySys_GetObject("stderr");
     if (f != NULL && f != Py_None) {
-        PyFile_WriteString("Exception ", f);
+        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;
@@ -828,15 +833,11 @@ PyErr_WriteUnraisable(PyObject *obj)
                 PyFile_WriteString(className, f);
             if (v && v != Py_None) {
                 PyFile_WriteString(": ", f);
-                PyFile_WriteObject(v, f, 0);
+                PyFile_WriteObject(v, f, Py_PRINT_RAW);
             }
+            PyFile_WriteString("\n", f);
             Py_XDECREF(moduleName);
         }
-        if (obj) {
-            PyFile_WriteString(" in ", f);
-            PyFile_WriteObject(obj, f, 0);
-        }
-        PyFile_WriteString(" ignored\n", f);
         PyErr_Clear(); /* Just in case */
     }
     Py_XDECREF(t);