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

Einheitlicher Weg gesucht um Exception Messages auszugeben

Beitragvon Zap » Montag 8. September 2008, 13:40

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:

Beitragvon BlackVivi » Montag 8. September 2008, 14:21

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

Beitragvon jens » Dienstag 9. September 2008, 08:52

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.

CMS in Python: http://www.pylucid.org
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:

Beitragvon veers » Dienstag 9. September 2008, 09:40

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

Beitragvon Zap » Dienstag 9. September 2008, 09:43

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)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]