Seite 1 von 1
err.message -> Python 2.6 - DeprecationWarning
Verfasst: Donnerstag 25. Juni 2009, 14:13
von jens
Code: Alles auswählen
try:
raise AttributeError("Foo")
except AttributeError, err:
print "1:", str(err)
print "----"
print "2:", err.message
Ausgabe:
Code: Alles auswählen
1: Foo
----
2:test.py:7: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
print "2:", err.message
Foo
Wegen der Änderung:
http://www.python.org/dev/peps/pep-0352/ kommt er beim zugriff auf
err.message zu dieser DeprecationWarning
Soll ich also zukünftig mit str(err) arbeiten???
Verfasst: Donnerstag 25. Juni 2009, 14:49
von lunar
Ja.
Verfasst: Donnerstag 25. Juni 2009, 15:12
von Zap
Wo wir gerade beim Thema sind.
Was tun wenn eine Exception mit Unicode gefüttert wurde?
Code: Alles auswählen
In [31]: try: raise Exception(u"müll")
....: except Exception, e: s = str(e)
....:
<type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\xfc' in position 1: ordinal not in range
(128)
Welche Informationen sind aus .args zugesichert?
Code: Alles auswählen
In [32]: try: raise Exception(u"müll")
....: except Exception, e: s = " ".join(e.args)
....:
In [33]: s
Out[33]: u'm\xfcll'
Das Modul Socket füllt die args auch wieder anders:
Code: Alles auswählen
In [39]: try: socket.socket(101010)
....: except Exception, e: pass
....:
In [40]: e.args
Out[40]: (10047, 'Address family not supported')
Am besten klappt's IMHO mit traceback.format_exc()
Obwohl auch da unicode Objekte mit non-ascii chars als <not printable > ausgegeben werden. Aber es gibt zumindest keine neue Exception bei der Behandlung

Verfasst: Donnerstag 25. Juni 2009, 15:28
von lunar
Encoding-Fehler vermeidet man, wenn "unicode" anstelle von "str" nutzt, und bei der Ausgabe des Fehlers korrekt enkodiert.
Der Inhalt des "args"-Attributs ist abhängig vom Typ der Ausnahme. Von EnvironmentError abgeleitete Ausnahmen haben in der Regel sogar drei Elemente in ".args". Daher sollte man auch "unicode()" nutzen, um die Fehlermeldung zu erzeugen.