I encountered a tricky situation with nested try-catch. Here is the sample code:

def f():
    raise Exception("f")

def g():
    raise Exception("g")

try:
    f()
except:
    # do cleanup
    try:
        g()
    except:
        pass # ignore
    raise

This code raises Exception("g") instead of Exception("f") as intended.
The first exception is lost when the second one is generated. However,
this issue has been resolved in Python 3.0.

$ python2.5 a.py
Traceback (most recent call last):
  File "a.py", line 13, in <module>
    g()
  File "a.py", line 6, in g
    raise Exception("g")
Exception: g

$ python3.0 a.py
Traceback (most recent call last):
  File "a.py", line 9, in <module>
    f()
  File "a.py", line 3, in f
    raise Exception("f")
Exception: f

I managed to work-around that problem like this:

try:
    f()
except:
    x = sys.exc_info()
    # do cleanup
    try:
        g()
    except:
        pass # ignore
    raise x[0], x[1], x[2]

It provides exception class, object and traceback to raise instead of
letting raise take the last exception/traceback.

Has anybody else faced similar situation? Any better solutions?

Anand
_______________________________________________
BangPypers mailing list
BangPypers@python.org
http://mail.python.org/mailman/listinfo/bangpypers

Reply via email to