Einheitlicher Weg gesucht um Exception Messages auszugeben

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

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

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Wie wäre es mit logging.exception?
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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)
Antworten