Python: How to catch inner exception of exception chain? -
consider simple example:
def f(): try: raise typeerror except typeerror: raise valueerror f() i want catch typeerror object when valueerror thrown after f() execution. possible it?
if execute function f() python3 print stderr raised exceptions of exception chain (pep-3134) like
traceback (most recent call last): file "...", line 6, in f raise typeerror typeerror during handling of above exception, exception occurred: traceback (most recent call last): file "...", line 11, in <module> f() file "...", line 8, in f raise valueerror valueerror so list of exceptions of exception chain or check if exception of type (typeerror in above example) exists in exception chain.
python 3 has beautiful syntactic enhancement on exceptions handling. instead of plainly raising valueerror, should raise caught exception, i.e.:
try: raise typeerror('something awful has happened') except typeerror e: raise valueerror('there bad value') e notice difference between tracebacks. 1 uses raise from version:
traceback (most recent call last): file "/home/user/tmp.py", line 2, in <module> raise typeerror('something awful has happened') typeerror: awful has happened above exception direct cause of following exception: traceback (most recent call last): file "/home/user/tmp.py", line 4, in <module> raise valueerror('there bad value') e valueerror: there bad value though result may seem similar, in fact rather different! raise from saves context of original exception , allows 1 trace exceptions chain - impossible simple raise.
to original exception, have refer new exception's __context__ attribute, i.e.
try: try: raise typeerror('something awful has happened') except typeerror e: raise valueerror('there bad value') e except valueerror e: print(e.__context__) >>> awful has happened hopefully solution looking for.
for more details, see pep 3134 -- exception chaining , embedded tracebacks
Comments
Post a Comment