Get Only the Last Items in a Traceback

gregpinero at gmail.com gregpinero at gmail.com
Wed Sep 12 14:31:56 EDT 2007


On Sep 12, 11:35 am, Peter Otten <__pete... at web.de> wrote:
> Am Wed, 12 Sep 2007 15:09:02 +0000 schrieb gregpin... at gmail.com:
>
>
>
> > On Sep 12, 5:17 am, Peter Otten <__pete... at web.de> 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_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.
> > Thanks for the help, Peter.  That's exactly what I need.
>
> Indeed. But not exactly what you want, it seems.
>
> > Now could I
> > use your tb.tb_next trick a couple times and thus avoid moving the try/
> > except?
>
> Of course you can cut off the traceback at arbitrary positions. Here's an
> example that uses the filename:
>
> import traceback
> import sys
>
> def tb_filename(tb):
>     return tb.tb_frame.f_code.co_filename
>
> def tb_iter(tb):
>     while tb is not None:
>         yield tb
>         tb = tb.tb_next
>
> def alpha():
>     try:
>         beta()
>     except Exception, e:
>         etype, value, tb = sys.exc_info()
>         filename = tb_filename(tb)
>         for tb in tb_iter(tb):
>             if tb_filename(tb) != filename:
>                 break
>         traceback.print_exception(etype, value, tb)
>
> def beta():
>     gamma()
>
> def gamma():
>     exec s in {}
>
> s = """
> def delta():
>     epsilon()
>
> def epsilon():
>     1/0
> delta()
> """
>
> if __name__ == "__main__":
>     alpha()
>
> Did I mention it already? It's better to move the try ... except.
>
> Peter


This approach is ideal.  Indirect, but ideal :-)  I'll apply it
tonight.

It's complicated but suffice it to say it would be difficult to move
the try/except.  Thanks for the help.  Way to know about tracebacks,
very impressive!

-Greg




More information about the Python-list mailing list