mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
Issue #7317: Display full tracebacks when an error occurs asynchronously.
Patch by Alon Horev with update by Alexey Kachayev.
This commit is contained in:
parent
6b973747f3
commit
76bcff27b2
4 changed files with 22 additions and 19 deletions
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue