error selbstgemacht

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
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

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, ...).
http://www.cs.unm.edu/~dlchao/flake/doom/
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

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
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

THX!

edit: und wie gibt man dem den typischen errortext?
Zuletzt geändert von murph am Mittwoch 2. August 2006, 20:54, insgesamt 1-mal geändert.
http://www.cs.unm.edu/~dlchao/flake/doom/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
Zuletzt geändert von gerold am Mittwoch 2. August 2006, 23:19, insgesamt 2-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

THX!
http://www.cs.unm.edu/~dlchao/flake/doom/
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Das zweite ist die ältere Variante. Inzwischen ist es sinnvoller die erste zu verwenden, da die zweite irgendwann verschwinden wird.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ich finde die Variante mit Klammern besser. Denn schliesslich instanziiert man da ein Objekt der Klasse XYZError, da macht man sonst auch immer Klammern.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

@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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Antworten