Passende Exception finden

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
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

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 :lol:

lg
codergirl
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

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

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 :ugeek:
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

'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.
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Hi

ja danke. Der Compiler schmeisst sie auch.

Vielleicht mach ich es so wie bisher auch und provoziere die Exception bis
ich genug Erfahrungen habe :)

codergirl
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Ich habe nun doch noch eine Frage.

Kann man eigentlich zu jeder Exception einen Fehlerstring bekommen?

Bsp:

Code: Alles auswählen

try:
   ...
except ValueError, err:
    print ("Die Exception war: " + repr(err))

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
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Alfons Mittelmeyer
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.
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Hallo

danke für den Tip mit str. Stimmt,dass sieht schöner aus :-)

codergirl
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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:

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.
Sirius3
User
Beiträge: 17757
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
BlackJack

@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.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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
User
Beiträge: 17757
Registriert: Sonntag 21. Oktober 2012, 17:20

@kbr: dafür kann man aber eval überhaupt nicht verwenden. auch wenn es ginge, wäre »error« deutlich kürzer als »eval(repr(error))«
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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.
Antworten