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
[email protected]
http://mail.python.org/mailman/listinfo/bangpypers