Mam kawałek kodu podobnego do tego:Wyjątek traceback jest ukryty, jeśli nie przebił natychmiast
import sys
def func1():
func2()
def func2():
raise Exception('test error')
def main():
err = None
try:
func1()
except:
err = sys.exc_info()[1]
pass
# some extra processing, involving checking err details (if err is not None)
# need to re-raise err so caller can do its own handling
if err:
raise err
if __name__ == '__main__':
main()
Kiedy func2
podnosi wyjątek pojawia się następujący Traceback:
Traceback (most recent call last):
File "err_test.py", line 25, in <module>
main()
File "err_test.py", line 22, in main
raise err
Exception: test error
Z tego miejsca nie widzę, skąd pochodzi wyjątek. Oryginalny traceback zostanie utracony.
Jak mogę zachować oryginalny traceback i ponownie go podnieść? Chcę zobaczyć coś podobnego do tego:
Traceback (most recent call last):
File "err_test.py", line 26, in <module>
main()
File "err_test.py", line 13, in main
func1()
File "err_test.py", line 4, in func1
func2()
File "err_test.py", line 7, in func2
raise Exception('test error')
Exception: test error
Warto wspomnieć, że to nie działa w Pythonie 3. – yprez
"To" w komentarzu do yprez oznacza "puste podbicie po opuszczeniu bloku z wyjątkiem". Nagie "podniesienie" działa w Pythonie 3 (ale tylko wewnątrz bloku z wyjątkiem). – jtniehof