On 7/16/2015 7:45 AM, Chris Angelico wrote:
On Thu, Jul 16, 2015 at 5:31 PM, Antoon Pardon
<antoon.par...@rece.vub.ac.be> wrote:
Traceback are not the only or even the most useful
tool for debugging code. The current stack trace
doesn't even contain the value's of the variables
on the stack. So in case of Terry Reedy's example
that stack trace would IMO have been next to useless.
Actually, they do contain all of that (at least, they do in Py3 - not
sure about Py2 as I haven't checked). You can poke around with the
locals at every point on the stack:
def f(x):
if x < 10: g(x+10)
return 5
def g(x):
if x % 3: h(x + 2)
return 7
def h(x):
return 1/x
try:
x = -12
print(f(x))
except ZeroDivisionError as e:
tb = e.__traceback__
while tb:
fr = tb.tb_frame
print("In function %s (%s:%d), x = %r" % (
fr.f_code.co_name,
fr.f_code.co_filename,
fr.f_lineno,
fr.f_locals["x"],
))
tb = tb.tb_next
It's all there. And it's immensely helpful.
One of the features of Idle is Debug => Stack Viewer, which, when
invoked immediately after an exception, displays a tree widget with a
node for each stack frame in the traceback. Running your code without
the extra try: except: stuff, so a traceback is displayed, I easily see
that x is -12, -2, and 0 in f, g, and h. I suspect that this feature is
not well known and is underused.
--
Terry Jan Reedy
--
https://mail.python.org/mailman/listinfo/python-list