excepthook doesn't give exact line number

Discussion in 'Python' started by Hari Sekhon, Oct 3, 2006.

  1. Hari Sekhon

    Hari Sekhon Guest

    Hi,

    I'm wondering if anyone can please help me on figuring out a better way
    of doing an excepthook. I have a script which is using an excepthook to
    catch any uncaught exceptions - there usually aren't any except when I
    am messing with the code, like right now :)

    The problem is that the excepthook gives the line of the topmost called
    function rather that the actual line that generated the error the way
    you get it with a normal traceback.


    import sys, traceback

    def myexcepthook(type,value,tb):
    <do something>

    exception_message = ( "\nLine no %s: %s - %s\n"
    "\nStack Trace:\n\n%s\n" %
    (tb.tb_lineno,type,value,str(traceback.print_exc(2))) )

    <send me an email etc....>

    sys.excepthook = myexcepthook

    <now do some work....>



    So the tb object that is passed into the function gives the tb.tb_lineno
    as a line right near the end where the original topmost called function
    happens. This is a bit useless to me since I don't want to go looking
    for the exception manually through the entire code.

    As you can see from my example, I have already used the traceback module
    which I usually use to give the normal traceback printout via
    traceback.print_exc(). Here it doesn't seem to work, it always give
    "None", likely because the excepthook has taken it or something.

    Any guiding wisdom from the masters out there?

    Much appreciated, thanks for reading.

    -h

    --
    Hari Sekhon
    Hari Sekhon, Oct 3, 2006
    #1
    1. Advertising

  2. Hari Sekhon

    Peter Otten Guest

    Hari Sekhon wrote:

    > The problem is that the excepthook gives the line of the topmost called
    > function rather that the actual line that generated the error the way
    > you get it with a normal traceback.


    A look into the traceback module shows that tracebacks are stored as a
    linked list. Here's a way to get hold of its tail:

    def tbiter(tb):
    while tb is not None:
    yield tb
    tb = tb.tb_next

    def last(items):
    for item in items:
    pass
    return item

    # example usage
    def myexcepthook(type, value, tb):
    tb_tail = last(tbiter(tb))
    print tb_tail.tb_lineno

    Peter
    Peter Otten, Oct 3, 2006
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Hugo
    Replies:
    10
    Views:
    1,291
    Matt Humphrey
    Oct 18, 2004
  2. Follower
    Replies:
    1
    Views:
    3,023
    Jeremy Fincher
    Oct 27, 2003
  3. grocery_stocker
    Replies:
    10
    Views:
    607
    Keith Thompson
    May 25, 2005
  4. Vasu
    Replies:
    2
    Views:
    578
    Knute Johnson
    Oct 18, 2008
  5. Paddy O'Loughlin
    Replies:
    1
    Views:
    305
    Diez B. Roggisch
    Apr 16, 2009
Loading...

Share This Page