On Sep 12, 5:17 am, Peter Otten <[EMAIL PROTECTED]> wrote: > > Your assessment is wrong. You only get the extra lines in the traceback if > you don't immediately wrap the exec statement in a try ... except block: > > $ cat snip_traceback1.py > import traceback > > def alpha(): > try: > beta() > except Exception, e: > traceback.print_exc() > > def beta(): > gamma() > > def gamma(): > exec s in {} > > s = """ > def delta(): > epsilon() > > def epsilon(): > 1/0 > delta() > """ > > if __name__ == "__main__": > alpha() > > $ python snip_traceback1.py > Traceback (most recent call last): > File "snip_traceback1.py", line 5, in alpha > beta() > File "snip_traceback1.py", line 10, in beta > gamma() > File "snip_traceback1.py", line 13, in gamma > exec s in {} > File "<string>", line 7, in <module> > File "<string>", line 3, in delta > File "<string>", line 6, in epsilon > ZeroDivisionError: integer division or modulo by zero > > So the first step is to move the try ... except closer to the exec: > > $ cat snip_traceback2.py > import traceback > > def alpha(): > beta() > > def beta(): > gamma() > > def gamma(): > try: > exec s in {} > except Exception, e: > traceback.print_exc() > > s = """ > def delta(): > epsilon() > > def epsilon(): > 1/0 > delta() > """ > > if __name__ == "__main__": > alpha() > > $ python snip_traceback2.py > Traceback (most recent call last): > File "snip_traceback2.py", line 11, in gamma > exec s in {} > File "<string>", line 7, in <module> > File "<string>", line 3, in delta > File "<string>", line 6, in epsilon > ZeroDivisionError: integer division or modulo by zero > > You are almost there. Now let's strip off the outermost traceback: > > $ cat snip_traceback3.py > import sys > import traceback > > def alpha(): > beta() > > def beta(): > gamma() > > def gamma(): > try: > exec s in {} > except Exception, e: > etype, value, tb = sys.exc_info() > traceback.print_exception(etype, value, tb.tb_next) > > s = """ > def delta(): > epsilon() > > def epsilon(): > 1/0 > delta() > """ > > if __name__ == "__main__": > alpha() > > $ python snip_traceback3.py > Traceback (most recent call last): > File "<string>", line 7, in <module> > File "<string>", line 3, in delta > File "<string>", line 6, in epsilon > ZeroDivisionError: integer division or modulo by zero > > Heureka. > > Peter
Thanks for the help, Peter. That's exactly what I need. Now could I use your tb.tb_next trick a couple times and thus avoid moving the try/ except? -Greg -- http://mail.python.org/mailman/listinfo/python-list