Seite 1 von 1
Python3: raise etype, evalue, etb
Verfasst: Dienstag 4. Oktober 2011, 12:38
von jens
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 ?
Re: Python3: raise etype, evalue, etb
Verfasst: Dienstag 4. Oktober 2011, 12:46
von lunar
Re: Python3: raise etype, evalue, etb
Verfasst: Dienstag 4. Oktober 2011, 17:24
von jens
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]]]
Re: Python3: raise etype, evalue, etb
Verfasst: Dienstag 4. Oktober 2011, 17:36
von lunar
Offensichtlich nicht. "2to3" kann die Python-2-Syntax allerdings in die entsprechende Python-3-Syntax umwandeln.
Re: Python3: raise etype, evalue, etb
Verfasst: Mittwoch 5. Oktober 2011, 07:27
von jens
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
""")