Seite 1 von 1

error selbstgemacht

Verfasst: Mittwoch 2. August 2006, 19:59
von murph
hi!
wie kann man selbst einen error definieren und raisen?
folgender umstand: ich habe einen sqliteserver und einen client.
wenn nun der sqliteserver einen error meldet (tabelle existiert bereits etc.),
soll dieser automatisch an den client weitergesendet werden.
dieser soll nun aber einen "Clone" von der Fehlermeldung an den user weitergeben.
mein Problem:
ich könnte natürlich ein False/True mitsenden, und damit dann zuerst etwas printen und danach einen systemexit erzwingen, allerdings dachte ich mir, dass es weitaus schöner wäre, einen error selbst zu erstellen, da ich das ebenfalls noch in anderen fällen gebrauchen kann (login, ...).

Verfasst: Mittwoch 2. August 2006, 20:38
von XT@ngel
Hi,
meinst Du eine eigene Ausnahme definieren
Im einfachsten Fall von der Basisklasse Exception ableiten

Code: Alles auswählen

class MeinFehler(Exception):
    pass
MfG
Andreas

Verfasst: Mittwoch 2. August 2006, 20:50
von murph
THX!

edit: und wie gibt man dem den typischen errortext?

Re: error selbstgemacht

Verfasst: Mittwoch 2. August 2006, 20:52
von gerold
murph hat geschrieben:wie kann man selbst einen error definieren und raisen?
Hi murph!

Das geht so:

Code: Alles auswählen

>>> class DatabaseError(RuntimeError):
...     """Datenbankinterner Fehler"""
...     def __init__(self, description = ""):
...         self.description = description
...     def __str__(self):
...         return self.description
... 
>>> raise DatabaseError("Also, ich bin der Beschreibungstext...")
Traceback (most recent call last):
  File "<input>", line 1, in ?
DatabaseError: Also, ich bin der Beschreibungstext...
>>>

lg
Gerold
:-)

Verfasst: Mittwoch 2. August 2006, 20:56
von murph
THX!

Verfasst: Donnerstag 3. August 2006, 09:13
von jens
Oder statt:

Code: Alles auswählen

raise DatabaseError("Also, ich bin der Beschreibungstext...")
einfach:

Code: Alles auswählen

raise DatabaseError, "Also, ich bin der Beschreibungstext..."
Frage mich allerdings welches die bessere Variante ist und überhaupt: Warum gibt es zwei Varianten???

Verfasst: Donnerstag 3. August 2006, 09:51
von birkenfeld
Das zweite ist die ältere Variante. Inzwischen ist es sinnvoller die erste zu verwenden, da die zweite irgendwann verschwinden wird.

Verfasst: Donnerstag 3. August 2006, 09:52
von Rebecca
Ich finde die Variante mit Klammern besser. Denn schliesslich instanziiert man da ein Objekt der Klasse XYZError, da macht man sonst auch immer Klammern.

Verfasst: Donnerstag 3. August 2006, 16:12
von CM
@birkenfeld - oder wer das sonst noch weiß:
Das ist mir neu. Ich habe recht viel Code mit der "alten" Syntax. Gibt es einen Link , der diese Syntax als deprecated erklärt? (Habe nichts finden können und mein Python gibt auch keine entsprechende Warnung (noch 2.4.1.).)

Gruß,
Christian

Verfasst: Donnerstag 3. August 2006, 18:11
von gerold
CM hat geschrieben:Gibt es einen Link , der diese Syntax als deprecated erklärt? (Habe nichts finden können und mein Python gibt auch keine entsprechende Warnung (noch 2.4.1.).)
Hi Christian!

Man liest es ab und zu in einem Buch, -- dass die Variante mit Klammern sich wahrscheinlich durchsetzen wird, da ja auch "Fehlerklassen" statt "String-Exceptions" empfohlen werden.

Hier http://docs.python.org/tut/node10.html# ... 0000000000 findet man auch einen kleinen Hinweis darauf:

Code: Alles auswählen

>>> raise NameError, 'HiThere'
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: HiThere
The first argument to raise names the exception to be raised. The optional second argument specifies the exception's argument. Alternatively, the above could be written as raise NameError('HiThere'). Either form works fine, but there seems to be a growing stylistic preference for the latter.
Also von "deprecated" kann noch keine Rede sein. ;-)

lg
Gerold
:-)

Verfasst: Donnerstag 3. August 2006, 19:00
von birkenfeld
In Python 3.0 wird nur noch die "neue" Form erlaubt sein (PEP 3100). Es gab so einen Versuch schon früher (PEP 317, darin ist auch ein Link zu einem Guido-Quote von 1997(!), wo er die neue Form bevorzugt), wurde aber wegen Kompatibilitätsgründen damals abgelehnt.

Verfasst: Freitag 4. August 2006, 09:23
von CM
Hoi Gerold und birkenfeld,

Danke für die Info. Dann werde ich mich mal an die Umstellung machen (hat ja noch etwas Zeit). Ich finde die "neue" Syntax ja auch schöner, sah aber bisher keinen Grund meinen Code zu ändern ...

Gruß,
Christian