summaryrefslogtreecommitdiff
path: root/Lib/test/test_thread.py
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2012-04-02 11:15:17 -0400
committerBenjamin Peterson <benjamin@python.org>2012-04-02 11:15:17 -0400
commit3f6d1484cc819dc6f879aaac59c6100bf30e4b64 (patch)
treec88c9708cd8a0f7798837c7c0325372a432f5cad /Lib/test/test_thread.py
parent1a33d3a39759a4708bba6eb0abff6f6e47d66e70 (diff)
downloadcpython-3f6d1484cc819dc6f879aaac59c6100bf30e4b64.tar.gz
prevent writing to stderr from messing up the exception state (closes #14474)
Diffstat (limited to 'Lib/test/test_thread.py')
-rw-r--r--Lib/test/test_thread.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py
index 894a49392e..deb4bf3620 100644
--- a/Lib/test/test_thread.py
+++ b/Lib/test/test_thread.py
@@ -128,6 +128,30 @@ class ThreadRunningTests(BasicThreadTest):
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):