saving an exception

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Bryan

    saving an exception

    hi,

    i would like to save an exception and reraise it at a later time.


    something similar to this:

    exception = None
    def foo():
        try:
            1/0
        except Exception, e:
            exception = e

    if exception: raise exception


    i have a need to do this because in my example foo is a callback from c code
    which was originally called from python and i can't modify the c code.
    with the above code, i'm able to successfully raise the exception, but the
    line number of the exception is at the place of the explicit raise instead
    of the where the exception originally occurred.  is there anyway to fix
    this?


    thanks,

    bryan

  • Ben Cartwright

    #2
    Re: saving an exception

    Bryan wrote:
    i would like to save an exception and reraise it at a later time.
    >
    something similar to this:
    >
    exception = None
    def foo():
    try:
    1/0
    except Exception, e:
    exception = e
    >
    if exception: raise exception
    >
    with the above code, i'm able to successfully raise the exception, but the
    line number of the exception is at the place of the explicit raise instead
    of the where the exception originally occurred. is there anyway to fix
    this?
    Sure: generate the stack trace when the real exception occurs. Check
    out sys.exc_info() and the traceback module.

    import sys
    import traceback

    exception = None
    def foo():
    global exception
    try:
    1/0
    except Exception:
    # Build a new exception of the same type with the inner stack
    trace
    exctype = sys.exc_info()[0]
    exception = exctype('\nInne r ' +
    traceback.forma t_exc().strip() )

    foo()
    if exception:
    raise exception

    # Output:
    Traceback (most recent call last):
    File "foo.py", line 15, in <module>
    raise exception
    ZeroDivisionErr or:
    Inner Traceback (most recent call last):
    File "foo.py", line 8, in foo
    1/0
    ZeroDivisionErr or: integer division or modulo by zero

    --Ben

    Comment

    Working...