reraise...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 11. September 2014, 10:19

six.py hat ja das nette:

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
""")
Nun habe ich sowas:

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])
Nun ergibt das, dies:

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...
Hier hätte ich allerdings gern, das klar ersichtlich ist, das hier ein KeyError aufgetreten ist. Denn so kann man Rätzeln, was einem die Fehlermeldung sagen soll...
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])
Aber geht das nicht einfacher?

bzw, gibt es nicht generell einen einfacheren "reraise" Ansatz für Python 2 und 3 ?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten