Detecting an active exception
Duncan Booth
duncan.booth at invalid.invalid
Fri Jun 1 16:13:50 EDT 2007
"NeBlackCat (lists)" <lists at asd-group.com> 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.
More information about the Python-list
mailing list