Python3: raise etype, evalue, etb

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Von der Seite http://wiki.python.de/try...except nutzte ich gern diese Variante:

Code: Alles auswählen

try:
    f = open("doesnotexist")
except:
    etype, evalue, etb = sys.exc_info()
    evalue = etype("Cannot open file: %s" % evalue)
    raise etype, evalue, etb
Wie Funktioniert das mit Python v3 ?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hm. Eine einheitliche Syntax die mit Python 2 und 3 funktioniert gibt es aber nicht, oder?

Python 3 raise_stmt ::= "raise" [expression ["from" expression]]
Python 2 raise_stmt ::= "raise" [expression ["," expression ["," expression]]]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
lunar

Offensichtlich nicht. "2to3" kann die Python-2-Syntax allerdings in die entsprechende Python-3-Syntax umwandeln.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich hab was in six gefunden: http://packages.python.org/six/#six.reraise
six.reraise(exc_type, exc_value, exc_traceback=None)

Reraise an exception, possibly with a different traceback. In the simple case, reraise(*sys.exc_info()) with an active exception (in an except block) reraises the current exception with the last traceback. A different traceback can be specified with the exc_traceback parameter.
Die Implementierung nutzt allerdings exec in Python 2, geht ja auch nicht anders, weil die Syntax von raise geändert wurde.

Zusammen gekürzt dürfte das dann so aus:

Code: Alles auswählen

if PY3:
    def reraise(tp, value, tb=None):
        if value.__traceback__ is not tb:
            raise value.with_traceback(tb)
        raise value
else:
    exec("""def reraise(tp, value, tb=None):
    raise tp, value, tb
""")

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten