Merge #17413: make sure settrace funcs get passed exception instances for 'value'.

Patch by Ingrid Cheung and Brendan McLoughlin.
This commit is contained in:
R David Murray 2013-04-19 12:57:54 -04:00
commit f097f175dd
4 changed files with 30 additions and 0 deletions

View file

@ -458,6 +458,29 @@ class RaisingTraceFuncTestCase(unittest.TestCase):
self.fail("exception not propagated") 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 # 'Jump' tests: assigning to frame.f_lineno within a trace function
# moves the execution position - it's how debuggers implement a Jump # moves the execution position - it's how debuggers implement a Jump
# command (aka. "Set next statement"). # command (aka. "Set next statement").

View file

@ -211,6 +211,7 @@ David Chaum
Nicolas Chauvat Nicolas Chauvat
Jerry Chen Jerry Chen
Michael Chermside Michael Chermside
Ingrid Cheung
Albert Chin-A-Young Albert Chin-A-Young
Adal Chiriliuc Adal Chiriliuc
Matt Chisholm Matt Chisholm
@ -802,6 +803,7 @@ Chris McDonough
Greg McFarlane Greg McFarlane
Alan McIntyre Alan McIntyre
Michael McLay Michael McLay
Brendan McLoughlin
Mark Mc Mahon Mark Mc Mahon
Gordon McMillan Gordon McMillan
Andrew McNamara Andrew McNamara

View file

@ -10,6 +10,10 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins 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 - Issue #17782: Fix undefined behaviour on platforms where
``struct timespec``'s "tv_nsec" member is not a C long. ``struct timespec``'s "tv_nsec" member is not a C long.

View file

@ -3793,6 +3793,7 @@ call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
value = Py_None; value = Py_None;
Py_INCREF(value); Py_INCREF(value);
} }
PyErr_NormalizeException(&type, &value, &traceback);
arg = PyTuple_Pack(3, type, value, traceback); arg = PyTuple_Pack(3, type, value, traceback);
if (arg == NULL) { if (arg == NULL) {
PyErr_Restore(type, value, traceback); PyErr_Restore(type, value, traceback);