[ACCEPTED]-For python is there a way to print variables scope from context where exception happens?-exception
You can use the function sys.exc_info()
to get the last 8 exception that occurred in the current thread 7 in you except clause. This will be a tuple 6 of exception type, exception instance and 5 traceback. The traceback is a linked list 4 of frame. This is what is used to print 3 the backtrace by the interpreter. It does 2 contains the local dictionnary.
So you can 1 do:
import sys
def f():
a = 1
b = 2
1/0
try:
f()
except:
exc_type, exc_value, tb = sys.exc_info()
if tb is not None:
prev = tb
curr = tb.tb_next
while curr is not None:
prev = curr
curr = curr.tb_next
print prev.tb_frame.f_locals
You have to first extract traceback, in 4 your example something like this would print 3 it:
except:
print sys.exc_traceback.tb_next.tb_frame.f_locals
I'm not sure about the tb_next, I would 2 guess you have to go through the complete 1 traceback, so something like this (untested):
except:
tb_last = sys.exc_traceback
while tb_last.tb_next:
tb_last = tb_last.tb_next
print tb_last.tb_frame.f_locals
Depending on what you need, there are 2 4 general best practices.
Just print the variables with minimal code edits
Have a look at some 3 related packages. For simple usage you might 2 pick traceback-with-variables (pip install traceback-with-variables
), here is it's postcard
Or try tbvaccine, or 1 better-exceptions, or any other package
Programmatically access variables to use them in your code
Use inspect
module
except ... as ...:
x = inspect.trace()[-1][0].f_locals['x']
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.