summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2012-04-02 15:15:17 (GMT)
committerBenjamin Peterson <benjamin@python.org>2012-04-02 15:15:17 (GMT)
commite900096dc42cd0d590752e00ba3983b4672da806 (patch)
treed8adc06a6312185ad155f4dea4e146e8447c42e8 /Lib
parentb6af60c2a9e2625987bcdd6775eb9fe8834c9641 (diff)
downloadcpython-e900096dc42cd0d590752e00ba3983b4672da806.zip
cpython-e900096dc42cd0d590752e00ba3983b4672da806.tar.gz
cpython-e900096dc42cd0d590752e00ba3983b4672da806.tar.bz2
prevent writing to stderr from messing up the exception state (closes #14474)
Diffstat (limited to 'Lib')
-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 894a493..deb4bf3 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):