Seite 1 von 1

exception - text speichern

Verfasst: Mittwoch 8. Februar 2006, 21:07
von Mad-Marty
Hallo.

ich habe einen DB treiber, der wenn etwas falsch ist eine exception schmeisst. Diese exception scheint ein tuple zu sein in der form (Errcode1, Errcode2, Description).

Ich möchte gerne den Errorcode aus der exception haben, wie stelle ich das an ?

Danke schonmal

Verfasst: Mittwoch 8. Februar 2006, 21:15
von modelnine
Probier mal aus:

Code: Alles auswählen

try:
    raise ValueError(1,2,3)
except ValueError, e:
    print repr(e.args), repr(e.args[0])
Ersetzen mußt Du halt noch ValueError durch den Exception-Typ den Du abfangen willst, und das wars.

--- Heiko.

Verfasst: Mittwoch 8. Februar 2006, 21:34
von Mad-Marty
Super, sogar wie erwartet recht einfach :)

Verfasst: Donnerstag 9. Februar 2006, 13:19
von Mad-Marty
Noch eine Frage, wie funktioniert das mit global Except , also ohne angabe des Fehlertyps ?

Verfasst: Donnerstag 9. Februar 2006, 13:24
von jens
Globale Exception? Angaben des Fehlertyps?

Meinst du vielleicht eigene Exceptions bzw. alle möglichen Exceptions?

Code: Alles auswählen

class MyException(Exception):
    pass

try:
    raise MyException(1,2,3)
except Exception, e:
    print repr(e.args), repr(e.args[0])

Verfasst: Donnerstag 9. Februar 2006, 16:11
von Mad-Marty
Ich meine, mit exceptions für alle möglichen Fehlertypen.


also

Code: Alles auswählen

try:
    "blah"
except:
    "...."

Verfasst: Donnerstag 9. Februar 2006, 16:20
von modelnine
Genau das was jens geschrieben hat. Alle Exceptions sind von Exception abgeleitet.

--- Heiko.

Verfasst: Donnerstag 9. Februar 2006, 16:22
von Mad-Marty
Aha, also reicht es wenn mein die Basisklasse angibt ?

Dachte man muss immer die genaue Error Klasse angeben.

Thx

Verfasst: Donnerstag 9. Februar 2006, 16:50
von modelnine
Nein. Ein

Code: Alles auswählen

except cls:
fängt alle Instanzen ab die cls-Instanzen sind, also auch Instanzen von Unterklassen.

Verfasst: Freitag 10. Februar 2006, 00:11
von BlackJack
modelnine hat geschrieben:Genau das was jens geschrieben hat. Alle Exceptions sind von Exception abgeleitet.
Schön wärs. Man kann mit ``raise`` jedes x-beliebige Objekt "werfen". Wenn man wirklich alles abfangen will, dann darf man nur ``except:`` nehmen und muss sich die Informationen zum Beispiel mit `sys.exc_info()` holen.

Verfasst: Freitag 10. Februar 2006, 00:14
von modelnine
Schön wärs. Man kann mit ``raise`` jedes x-beliebige Objekt "werfen". Wenn man wirklich alles abfangen will, dann darf man nur ``except:`` nehmen und muss sich die Informationen zum Beispiel mit `sys.exc_info()` holen.
Jaaaaa... Die allermeißten sind von Exception abgeleitet. String-Exceptions sind offiziell very deprecated, und die Stdlib hält sich eigentlich daran alle exceptions von Exception abzuleiten. Deswegen mein nicht ganz korrekter Kommentar. Ich hab bisher noch nie eine Exception in Produktionscode gesehen die nicht von Exception abgeleitet gewesen wäre.

Verfasst: Freitag 10. Februar 2006, 07:59
von jens
modelnine hat geschrieben:Ich hab bisher noch nie eine Exception in Produktionscode gesehen die nicht von Exception abgeleitet gewesen wäre.
Das sollte wirklich eine Ausnahme sein. Allerdings hatte ich das schonmal bei MySQLdb, zwar eine relativ alte Version des Modules, aber leider ist das bei vielen WebHostern noch zu finden :cry:

Verfasst: Freitag 10. Februar 2006, 11:10
von Mad-Marty
BlackJack hat geschrieben:
modelnine hat geschrieben:Genau das was jens geschrieben hat. Alle Exceptions sind von Exception abgeleitet.
Schön wärs. Man kann mit ``raise`` jedes x-beliebige Objekt "werfen". Wenn man wirklich alles abfangen will, dann darf man nur ``except:`` nehmen und muss sich die Informationen zum Beispiel mit `sys.exc_info()` holen.
Wie würde das funktionieren mit sys.exc_info() ?

Verfasst: Freitag 10. Februar 2006, 11:12
von jens
Also ich würde lieber einfach ein except Exception, e: machen... Das sollte in 99% der Fälle funktionieren...

Verfasst: Samstag 11. Februar 2006, 00:09
von BlackJack
Mad-Marty hat geschrieben:Wie würde das funktionieren mit sys.exc_info() ?
Damit bekommt man ein Tupel mit dem Typ der "Ausnahme", der konkreten Instanz und einen Stapelabzug für den es im `traceback` Modul einige nützliche Funktionen gibt.

Code: Alles auswählen

import sys
from traceback import print_tb

class Spam:
    pass

try:
    raise Spam
except:
    type_, value, traceback = sys.exc_info()
    print type_
    print value
    print print_tb(traceback)