Code: Alles auswählen
if sys.version_info[0] == 3:
def reraise(tp, value, tb=None):
if value is None:
value = tp()
if value.__traceback__ is not tb:
raise value.with_traceback(tb)
raise value
else:
def exec_(_code_, _globs_=None, _locs_=None):
"""Execute code in a namespace."""
if _globs_ is None:
frame = sys._getframe(1)
_globs_ = frame.f_globals
if _locs_ is None:
_locs_ = frame.f_locals
del frame
elif _locs_ is None:
_locs_ = _globs_
exec("""exec _code_ in _globs_, _locs_""")
exec_("""def reraise(tp, value, tb=None):
raise tp, value, tb
""")Code: Alles auswählen
foo = {}
addr = 123
try:
bar = foo[addr]
except Exception as err:
msg = "%s | Hier Zusatzinformationen..." % err
reraise(Exception, Exception(msg), sys.exc_info()[2])Code: Alles auswählen
Traceback (most recent call last):
File "test.py", line 42, in <module>
reraise(Exception, Exception(msg), sys.exc_info()[2])
File "test.py", line 36, in <module>
bar = foo[addr]
Exception: 123 | Hier Zusatzinformationen...Also ich hätte gern diese Meldung:
Code: Alles auswählen
...
bar = foo[addr]
KeyError: 123 | Hier Zusatzinformationen...Das err bei except Exception as err: ist eigentlich eine Instanz von KeyError. Also die Information ist eigentlich da... Deswegen sieht meine Aktuelle Lösung so aus:
Code: Alles auswählen
...
except Exception as err:
msg = "%s | Hier Zusatzinformationen..." % err
exception = err.__class__
reraise(exception, exception(msg), sys.exc_info()[2])bzw, gibt es nicht generell einen einfacheren "reraise" Ansatz für Python 2 und 3 ?
