Seite 1 von 1

Einheitlicher Weg gesucht um Exception Messages auszugeben

Verfasst: Montag 8. September 2008, 13:40
von Zap
Ich habe in der letzten Zeit öfter mal die Erfahrung machen dürfen, dass egal wie ich exceptions abfange, es immer wieder Fälle gibt in denen eine der Lösungen nicht funktioniert.

Beispiele:

Code: Alles auswählen

In [54]: try: raise ValueError(u"brötchen")
   ....: except ValueError, e: pass
   ....:

In [55]: str(e) # Das geht natürlich nicht...
---------------------------------------------------------------------------
<type 'exceptions.UnicodeEncodeError'>    Traceback (most recent call last)

H:\<ipython console> in <module>()

<type 'exceptions.UnicodeEncodeError'>: "'ascii' codec can't encode character u'\xf6' in position 2: ordinal not in range
(128)"

In [56]: e.message # Dann mach ich es lieber so und arbeite mit unicode weiter
Out[56]: u'br\xf6tchen'

In [57]: try: str(u"brötchen")
   ....: except UnicodeEncodeError, e: pass
   ....:

In [58]: e.message # Toll, mein message Attribut ist leer!?
Out[58]: ''

In [59]: str(e) # Dann muss ich wohl doch den Weg nehmen
Out[59]: "'ascii' codec can't encode character u'\\xf6' in position 2: ordinal not in range(128)"
Kennt ihr noch andere Möglichkeiten?
Wie ermittelt ihr die Meldung von gefangenen Exceptions?

Was mich ein wenig an dem Zugriff über message gestört hat, war die Tatsache das es nicht von älteren Versionen wie Pyhton2.3 unterstützt wird. Aber damit hatte ich mich eigentlich abgefunden.

Verfasst: Montag 8. September 2008, 14:21
von BlackVivi
Was willst du denn herausfinden?... UnicodeEncodeError schreibt ja in e noch mehr rein....

Code: Alles auswählen

In [7]: e.
e.__class__         e.__init__          e.args
e.__delattr__       e.__new__           e.encoding
e.__dict__          e.__reduce__        e.end
e.__doc__           e.__reduce_ex__     e.message
e.__getattribute__  e.__repr__          e.object
e.__getitem__       e.__setattr__       e.reason
e.__getslice__      e.__setstate__      e.start
e.__hash__          e.__str__           

Nur Message ist in diesem Fall leer! Vielleicht ist diese Exception einfach ohne message implementiert...

Verfasst: Dienstag 9. September 2008, 08:52
von jens

Code: Alles auswählen

try:
    raise ValueError(u"brötchen")
except ValueError, e:
    print repr(e)
    print repr(e.args[0])
Ausgabe:
ValueError(u'br\xf6tchen',)
u'br\xf6tchen'
Oder du schaust nach wie dein Ausgangsencoding ist und konvertierst es.

Verfasst: Dienstag 9. September 2008, 09:40
von veers
Wie wäre es mit logging.exception?

Verfasst: Dienstag 9. September 2008, 09:43
von Zap
Danke für die Idee, aber UnicodeEncodeError ist leider ein ziemlich spezieller Kandidat ;)

Code: Alles auswählen

In [1]: try: str(u"brötchen")
   ...: except UnicodeEncodeError, e:
   ...:     print repr(e.args[0])
   ...:
   ...:
'ascii'

In [2]: e.args
Out[2]: ('ascii', u'br\xf6tchen', 2, 3, 'ordinal not in range(128)')
BlackVivi hat geschrieben:Was willst du denn herausfinden?...
Ich hatte den konkreten Fall, dass durch Usereingaben die oben gezeigten Exceptions aufgetreten sind. Die dabei zurückgemeldete Fehlemeldung sollte neben eigenen Informationen auch die Exceptionmeldung beinhalten aber wie ich fesstellen durfte war das message Attribut bei UnicodeEncodeErrors leer. Eine leere Fehlermeldung ist leider etwas mager ;)

Mich hat halt nur interessiert ob es vielleicht eine Möglichkeit gibt die immer funktioniert. Es ist aber halb so wild wenn nicht.

Man könnte es ja (wenn nötig) so machen:

Code: Alles auswählen

try:
    do_somthing()
except Exception, e:
    print getattr(e, "message", None) or str(e)