"NeBlackCat (lists)" <[EMAIL PROTECTED]> wrote: > Depending on what you read, sys.exc_info() is supposed to return > (None,None,None) when there is no active exception, but it seems that > it returns info about the last exception when there isn't one > currently active. > > For example: > > try: > a = a + 1 > except: > pass > > print sys.exc_info() > > produces: ><class exceptions.NameError at 0x009648D0>, <exceptions.NameError > instance at 0x00B5E508>, <traceback object at 0x00B5E4E0> > > Where the traceback object identifies the offending a=a+1 line (of > course). > > Is there another way of doing this? Note that I can't rely on using > sys.exc_clear() in any solution, unfortunately.
I think you have misunderstood the definition of when an exception is 'currently active'. When an exception is caught, it remains currently active so long as you are in the same function, or in a function which it calls (i.e. so long as the current scope is still active). When you return from that function the exception is no longer active and the previous exception becomes active (or None if there has not been one or you have used sys.exc_clear()). Try this: --------- t.py ------------- import sys def f(): try: a = a + 1 except: pass g() print "f", sys.exc_info() def g(): print "g", sys.exc_info() def h(): f() print "h", sys.exc_info() h() ---------------------------- The output is: g (<type 'exceptions.UnboundLocalError'>, UnboundLocalError("local variable 'a' referenced before assignment",), <traceback object at 0x00A8B300>) f (<type 'exceptions.UnboundLocalError'>, UnboundLocalError("local variable 'a' referenced before assignment",), <traceback object at 0x00A8B300>) h (None, None, None) As you can see the exception remains 'currently active' only until the function in which it was caught returns. -- http://mail.python.org/mailman/listinfo/python-list