Powiedzmy mam następujący ciąg multi-line:jak uzyskać numer linii błędu z Exec lub execfile w Pythonie
cmd = """
a = 1 + 1
b = [
2 + 2,
4 + 4,
]
bork bork bork
"""
i chcę go wykonać w określonym zakresie:
scope = {}
exec(cmd, scope)
print scope[ 'b' ]
W wierszu 6 polecenia znajduje się SyntaxError
i chcę mieć możliwość zgłoszenia tego użytkownikowi. Jak uzyskać numer linii? Próbowałem to:
try:
exec(cmd, scope) # <-- let's say this is on line 123 of the source file
except Exception, err:
a, b, c = sys.exc_info()
line_number = c.tb_lineno # <-- this gets me 123, not 6
print "%s at line %d (%s)" % (a, line_number, b.message)
... ale pojawia się numer wiersza rachunku exec
, a nie numer linii w poleceniu multi-line.
Aktualizacja: okazuje się, że obsługa wyjątku, który arbitralnie wybrałem dla tego przykładu, SyntaxError
, różni się od obsługi dowolnego innego typu. Aby wyjaśnić, szukam rozwiązania, które radzi sobie z każdym rodzajem wyjątku.
Pan spojrzał w [ 'pdb'] (https://docs.python.org/2/library/pdb.html)? – jonrsharpe