
python-checkins at python
Apr 2, 2012, 8:28 AM
Post #180 of 192
(150 views)
Permalink
|
|
cpython (merge 3.2 -> default): merge 3.2
[In reply to]
|
|
http://hg.python.org/cpython/rev/b92e34c1e07c changeset: 76069:b92e34c1e07c parent: 76065:883689757a2e parent: 76068:60ad83716733 user: Benjamin Peterson <benjamin [at] python> date: Mon Apr 02 11:28:49 2012 -0400 summary: merge 3.2 files: Lib/test/test_thread.py | 24 ++++++++++++++++++++++++ Misc/NEWS | 3 +++ Modules/_threadmodule.c | 3 +++ 3 files changed, 30 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -128,6 +128,30 @@ time.sleep(0.01) self.assertEqual(thread._count(), orig) + def test_save_exception_state_on_error(self): + # See issue #14474 + def task(): + started.release() + sys.stderr = stderr + raise SyntaxError + def mywrite(self, *args): + try: + raise ValueError + except ValueError: + pass + real_write(self, *args) + c = thread._count() + started = thread.allocate_lock() + with support.captured_output("stderr") as stderr: + real_write = stderr.write + stderr.write = mywrite + started.acquire() + thread.start_new_thread(task, ()) + started.acquire() + while thread._count() > c: + pass + self.assertIn("Traceback", stderr.getvalue()) + class Barrier: def __init__(self, num_threads): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #14474: Save and restore exception state in thread.start_new_thread() + while writing error message if the thread leaves a unhandled exception. + - Issue #13019: Fix potential reference leaks in bytearray.extend(). Patch by Suman Saha. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1001,14 +1001,17 @@ PyErr_Clear(); else { PyObject *file; + PyObject *exc, *value, *tb; PySys_WriteStderr( "Unhandled exception in thread started by "); + PyErr_Fetch(&exc, &value, &tb); file = PySys_GetObject("stderr"); if (file != NULL && file != Py_None) PyFile_WriteObject(boot->func, file, 0); else PyObject_Print(boot->func, stderr, 0); PySys_WriteStderr("\n"); + PyErr_Restore(exc, value, tb); PyErr_PrintEx(0); } } -- Repository URL: http://hg.python.org/cpython
|