mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Merge #17413: make sure settrace funcs get passed exception instances for 'value'.
Patch by Ingrid Cheung and Brendan McLoughlin.
This commit is contained in:
commit
f097f175dd
4 changed files with 30 additions and 0 deletions
|
@ -458,6 +458,29 @@ class RaisingTraceFuncTestCase(unittest.TestCase):
|
|||
self.fail("exception not propagated")
|
||||
|
||||
|
||||
def test_exception_arguments(self):
|
||||
def f():
|
||||
x = 0
|
||||
# this should raise an error
|
||||
x.no_such_attr
|
||||
def g(frame, event, arg):
|
||||
if (event == 'exception'):
|
||||
type, exception, trace = arg
|
||||
self.assertIsInstance(exception, Exception)
|
||||
return g
|
||||
|
||||
existing = sys.gettrace()
|
||||
try:
|
||||
sys.settrace(g)
|
||||
try:
|
||||
f()
|
||||
except AttributeError:
|
||||
# this is expected
|
||||
pass
|
||||
finally:
|
||||
sys.settrace(existing)
|
||||
|
||||
|
||||
# 'Jump' tests: assigning to frame.f_lineno within a trace function
|
||||
# moves the execution position - it's how debuggers implement a Jump
|
||||
# command (aka. "Set next statement").
|
||||
|
|
|
@ -211,6 +211,7 @@ David Chaum
|
|||
Nicolas Chauvat
|
||||
Jerry Chen
|
||||
Michael Chermside
|
||||
Ingrid Cheung
|
||||
Albert Chin-A-Young
|
||||
Adal Chiriliuc
|
||||
Matt Chisholm
|
||||
|
@ -802,6 +803,7 @@ Chris McDonough
|
|||
Greg McFarlane
|
||||
Alan McIntyre
|
||||
Michael McLay
|
||||
Brendan McLoughlin
|
||||
Mark Mc Mahon
|
||||
Gordon McMillan
|
||||
Andrew McNamara
|
||||
|
|
|
@ -10,6 +10,10 @@ What's New in Python 3.4.0 Alpha 1?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #17413: sys.settrace callbacks were being passed a string instead of an
|
||||
exception instance for the 'value' element of the arg tuple if the exception
|
||||
originated from C code; now an exception instance is always provided.
|
||||
|
||||
- Issue #17782: Fix undefined behaviour on platforms where
|
||||
``struct timespec``'s "tv_nsec" member is not a C long.
|
||||
|
||||
|
|
|
@ -3793,6 +3793,7 @@ call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
|
|||
value = Py_None;
|
||||
Py_INCREF(value);
|
||||
}
|
||||
PyErr_NormalizeException(&type, &value, &traceback);
|
||||
arg = PyTuple_Pack(3, type, value, traceback);
|
||||
if (arg == NULL) {
|
||||
PyErr_Restore(type, value, traceback);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue