Hallo,
ich tute mich hin und wieder noch schwer, im Vorfeld die passenden Exception zu finden.
Aktuell mach ich es so, das ich entweder ein Beispiel suche oder diese bewusst im Compiler
erzeuge und die Antwort des Compilers drauf übernehme.
Aber ist ja nicht so das coole Ding
lg
codergirl
Passende Exception finden
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
@CoderGirl: siehe hier: https://docs.python.org/3.6/library/exc ... exceptions
Hallo,
danke Dir. Das hilft schonmal, aber nicht in allen Fällen, oder ich kapiere es nicht zu 100%.
Ein Beispiel stellvertretend für ggf. andere:
Ich möchte den asin(arg) berechnen und mein arg > 1 oder arg < (-1), was ja nicht definiert ist.
Da es ja keine in meinen Augen passende abgeleitete Klasse der Baseclass "ArithmeticError"
gibt (OverflowError, ZeroDivisionError, FloatingPointError passen meines Erachtens nicht), nehme
ich dann die Baseclass selbst oder definiere ich eine eigene resp. nehme die "undefinied" der form
danke euch wieder mal
codergirl
danke Dir. Das hilft schonmal, aber nicht in allen Fällen, oder ich kapiere es nicht zu 100%.
Ein Beispiel stellvertretend für ggf. andere:
Ich möchte den asin(arg) berechnen und mein arg > 1 oder arg < (-1), was ja nicht definiert ist.
Da es ja keine in meinen Augen passende abgeleitete Klasse der Baseclass "ArithmeticError"
gibt (OverflowError, ZeroDivisionError, FloatingPointError passen meines Erachtens nicht), nehme
ich dann die Baseclass selbst oder definiere ich eine eigene resp. nehme die "undefinied" der form
Code: Alles auswählen
try:
pass
except:
print ("Argument im undefinierten Intervall")
raise
danke euch wieder mal
codergirl
Nur ein Mädchen, das nie so viel weiss, wie die Jungs
'ValueError' wäre m.W.n. eine gängige Option hier und in vergleichbaren Kontexten. Zum Beispiel "raise ValueError('Value not in interval')" oder so.
Ich habe nun doch noch eine Frage.
Kann man eigentlich zu jeder Exception einen Fehlerstring bekommen?
Bsp:
Oder hängt dies von der Exception ab?
ich weiss, dass es für bestimmte auf jeden Fall geht und man auch noch Instanzen davon ausgeben lassen
kann, aber ob es im Grunde "immer" geht, wird mir aus den Dokus nicht ganz klar
codergirl
Kann man eigentlich zu jeder Exception einen Fehlerstring bekommen?
Bsp:
Code: Alles auswählen
try:
...
except ValueError, err:
print ("Die Exception war: " + repr(err))
ich weiss, dass es für bestimmte auf jeden Fall geht und man auch noch Instanzen davon ausgeben lassen
kann, aber ob es im Grunde "immer" geht, wird mir aus den Dokus nicht ganz klar
codergirl
Nur ein Mädchen, das nie so viel weiss, wie die Jungs
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
@CoderGirl: wenn ein Error keinen Errorstring hätte, kann man mit repr(err) zumindest den ErrorKey bekommen.
Allerdings gleich den Fehler mit repr auszugeben, liefert auch nicht unbedingt eine schön anzusehende Meldung.
Also vielleicht zuerst mit str probieren und sollte dieses einmal leer sein, dann mit repr nachsetzen.
Allerdings gleich den Fehler mit repr auszugeben, liefert auch nicht unbedingt eine schön anzusehende Meldung.
Also vielleicht zuerst mit str probieren und sollte dieses einmal leer sein, dann mit repr nachsetzen.
@CoderGirl: Jede Exception verfügt über eine __str__ Methode. D.h. zur Ausgabe einer Fehlermeldung genügt der Aufruf der print-Funktion mit der Ausnahme als Argument:
Mit 'print(repr(error))' erhältst Du zusätzlich den Klassennamen der Ausnahme mit der Fehlermeldung als Argument, so dass diese mittels 'eval' wieder erzeugt werden könnte. Beides ist aber in der Praxis zumeist nicht erforderlich. Die Ausnahme selbst kennst Du bereits, denn sonst wäre diese nicht abgefangen worden. Und für ein erneutes auslösen genügt ein einfaches 'raise'.
Das Vorgehen, Code zunächst ohne Fehlerbehandlung zu schreiben und das Exception-Handling mit dem Austesten zu erwartender Fehler einzufügen, ist völlig ok.
Code: Alles auswählen
import math
try:
math.log(0)
except ValueError as error:
print(error)
raise eval(repr(error)) # hier reicht auch ein einfaches raise
Mit 'print(repr(error))' erhältst Du zusätzlich den Klassennamen der Ausnahme mit der Fehlermeldung als Argument, so dass diese mittels 'eval' wieder erzeugt werden könnte. Beides ist aber in der Praxis zumeist nicht erforderlich. Die Ausnahme selbst kennst Du bereits, denn sonst wäre diese nicht abgefangen worden. Und für ein erneutes auslösen genügt ein einfaches 'raise'.
Das Vorgehen, Code zunächst ohne Fehlerbehandlung zu schreiben und das Exception-Handling mit dem Austesten zu erwartender Fehler einzufügen, ist völlig ok.
@CoderGirl: welche Exceptions auftreten können, steht in der Dokumentation, wenn sie gut ist, z.B. für mathematische Funktionen ganz unten. Weder Exceptions mit repr noch mit str auszugeben ist gut, da man Exceptions entweder sinnvoll behandeln kann, dann braucht man keine Ausgabe des meist nicht sehr aussagekräftigen Textes oder man kann sie nicht sinnvoll behandeln, dann sollte man das ganz sein lassen.
@kbr: Woah, was soll denn der Unsinn mit dem `eval()`? Es ist nirgends garantiert das die Zeichenkettendarstellung einer Ausnahme als Ausdruck ausgewertet werden kann! Selbst bei Ausnahmen bei denen das ginge, muss die Ausnahme ja gar nicht unter dem Namen aus der Zeichenkettendarstellung im aktuellen Kontext verfügbar sein, womit die Auswertung fehlschlägt.
@BlackJack: Na, Du weißt doch, wofür eval/repr gut ist. Das dies stets klappt, ist nie garantiert. Habe ich hier verwendet um zu zeigen, wofür man es überhaupt verwenden könnte, da repr bereits zur Sprache kam. Mit dem Hinweis, dass ein einfaches raise genügt. Habe ich vielleicht nicht deutlich genug betont.
@Sirius3: "raise eval(repr(error))" funktioniert zumindest in dem Beispiel. Natürlich ist 'raise' die Anweisung der Wahl; ich dachte da hätte ich deutlich genug drauf hingewiesen. Mein Fehler, so ein Beispiel überhaupt zu bringen.