Seite 1 von 1

Passende Exception finden

Verfasst: Montag 1. Mai 2017, 06:30
von CoderGirl
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

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 07:53
von Alfons Mittelmeyer

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 08:34
von CoderGirl
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

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 08:52
von nezzcarth
'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.

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 09:39
von CoderGirl
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

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 09:43
von CoderGirl
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

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 10:25
von Alfons Mittelmeyer
@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.

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 10:47
von CoderGirl
Hallo

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

codergirl

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 11:47
von kbr
@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.

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 11:57
von Sirius3
@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.

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 12:08
von 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.

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 12:22
von kbr
@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.

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 12:29
von Sirius3
@kbr: dafür kann man aber eval überhaupt nicht verwenden. auch wenn es ginge, wäre »error« deutlich kürzer als »eval(repr(error))«

Re: Passende Exception finden

Verfasst: Montag 1. Mai 2017, 12:46
von kbr
@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.