mirror of
https://github.com/python/cpython.git
synced 2025-08-25 19:24:42 +00:00
merge 3.2
This commit is contained in:
commit
dba1b40b60
3 changed files with 30 additions and 0 deletions
|
@ -128,6 +128,30 @@ class ThreadRunningTests(BasicThreadTest):
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
self.assertEqual(thread._count(), orig)
|
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:
|
class Barrier:
|
||||||
def __init__(self, num_threads):
|
def __init__(self, num_threads):
|
||||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.3.0 Alpha 3?
|
||||||
Core and Builtins
|
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
|
- Issue #13019: Fix potential reference leaks in bytearray.extend(). Patch
|
||||||
by Suman Saha.
|
by Suman Saha.
|
||||||
|
|
||||||
|
|
|
@ -1001,14 +1001,17 @@ t_bootstrap(void *boot_raw)
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
else {
|
else {
|
||||||
PyObject *file;
|
PyObject *file;
|
||||||
|
PyObject *exc, *value, *tb;
|
||||||
PySys_WriteStderr(
|
PySys_WriteStderr(
|
||||||
"Unhandled exception in thread started by ");
|
"Unhandled exception in thread started by ");
|
||||||
|
PyErr_Fetch(&exc, &value, &tb);
|
||||||
file = PySys_GetObject("stderr");
|
file = PySys_GetObject("stderr");
|
||||||
if (file != NULL && file != Py_None)
|
if (file != NULL && file != Py_None)
|
||||||
PyFile_WriteObject(boot->func, file, 0);
|
PyFile_WriteObject(boot->func, file, 0);
|
||||||
else
|
else
|
||||||
PyObject_Print(boot->func, stderr, 0);
|
PyObject_Print(boot->func, stderr, 0);
|
||||||
PySys_WriteStderr("\n");
|
PySys_WriteStderr("\n");
|
||||||
|
PyErr_Restore(exc, value, tb);
|
||||||
PyErr_PrintEx(0);
|
PyErr_PrintEx(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue