ValueError - Problem mit Try/Except

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
heiliga horsd

Hallo,

in Rahmen meiner Überarbeitungen eines Programms bin ich auf folgendes Problem gestoßen:

Ich lasse Daten mittels

Code: Alles auswählen

int(input())
eingeben.

Wenn ich keine Eingabe erhalte (also nur Enter oder 0) wurde die Variable im alten Programm mit '0' gekennzeichnet, was soviel hieß, dass sie berechnet wird. Nun will ich aber zusätzlich falsche Eingaben wie beispielsweise 'Falsche Eingabe haha' mit einer Meldung wie 'positive Zahl eingeben' abfangen. Da beide Vorgänge einen ValueError hervor rufen bin ich letzendlich mit der Erstellung eines eigenen Errors belastet. Da ich soetwas vorher noch nie gemacht habe und mich auch wirklich _überhaupt nicht_ damit auskenne, hoffe ich dass ihr mir mal Hilfestellung bzw. einen Grundansatz liefern könnt den ich dann ein bisschen Abändern und verwenden kann.

Grundsätzlich habe ich mir zwar gedacht, dass man das evtl. auch gleich vom ValueError ableiten kann, aber bevor ich mich verlaufe frage ich lieber nochmal experten.


Falls etwas unklar ist, bitte fragen!

Lg HH
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

heiliga horsd hat geschrieben:Falls etwas unklar ist, bitte fragen!
So ziemlich alles.

Warum _musst_ du eine eigene Exception erstellen?

Erzaehl mal etwas ueber die Eingaben und wie sie behandelt werden sollen in einer Tabelle o.ae.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Code: Alles auswählen

while True:
    a = raw_input ('Irgendwas?: ')
    try:
        a = int(a)
   except ValueError:
       print('Falsche Eingabe haha!')
   else:
       break 
the more they change the more they stay the same
heiliga horsd

Also, es geht letzendlich um geometrische Berechnungen, jedoch weiß das Programm anfangs nicht was gesucht ist. Es frägt also alle Größen (Seitenlängen und winkel etc.) ab. Wenn eine größe unbekannt ist drückt der Anwender einfach auf Enter, was den ValueError auslöst und die Variable wird mit 0 belegt. Nun will ich bei falschen Angaben, also beispielsweise "Hallo Programm" (schonmal ein rechteck mit der Länge "Hallo Programm" gesehen?) ausgeben, dass eine positive Zahl eingegeben werden soll.

Also es gibt zwei Eingaben die einen ValueError hervorrufen, bei der einen (Nur enter, also keine wirkliche eingabe) soll die Variable mit 0 belegt werden und bei der anderen (keine positive zahl) ein fehlertext ausgegeben werden.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ja, dann mach das doch :twisted:

Im Ernst, wenn du willst, dass wir hier *kostenlos* deine Arbeit erledigen, dann bist du hier falsch. Wir helfen bei Problemen und können Hilfestellung geben. Aber "Ich will dieses und jenes haben!" ohne zu zeigen, was du bereits versucht hast, is nicht drin.

Zum Lesen + Verstehen: http://docs.python.org/tutorial/errors.html
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Ich werfe mal folgendes in den Raum:

Code: Alles auswählen

>>> bool('')
False
heiliga horsd

Aber nein, es war nicht so gemeint dass ihr kostenlos meine arbeit machen sollt! tut mir Leid wenn das so rüber kam!

Code: Alles auswählen

for i in varList:
    try:
        varList[i] = int(input(NamenListe[i])))
    except ValueError:
        varList[i] = int(0)
Dieses Codestück geht alle Variablen in der Liste Varlist durch und verlangt eine Eingabe, falls ein ValueError geworfen wird wird die Variable mit 0 besetzt, was für das programm bedeutet: Muss ausgerechnet werden.

Nun will ich für gänzlich falsche Eingaben einen Fehlertext ausgeben und nicht die Variable einfach mit 0 belegen lassen, aber Python unterscheidet nicht zwischen ValueError und ValueError und deshalb würde ich hier eine eigene Fehlerklasse anlegen wovon ich leider keine Ahnung habe und hätte deshalb gehofft, dass ihr mir bei 10 Zeilen Code ein wenig unter die arme greifen könnt.

Ich versuche so viel wie möglich in der Doku mit meinen nicht allzu umfangreichen Englischkenntnissen zu verstehen, aber bei
Exception classes can be defined which do anything any other class can do, but are usually kept simple, often only offering a number of attributes that allow information about the error to be extracted by handlers for the exception. When creating a module that can raise several distinct errors, a common practice is to create a base class for exceptions defined by that module, and subclass that to create specific exception classes for different error conditions:


hört es leider in meinem Kopf auf. Ich verstehe da nicht wirklich was die mir jetzt da sagen wollen....

@gkuhl: Danke, das wäre eine alternative Lösung des Problems wenn leere Eingaben False sind! Gibt es noch andere Dinge die "False" sind, nicht dass ich da auf einmal Überraschungen erlebe? http://docs.python.org/py3k/library/fun ... =bool#bool
hilft mir da nämlich nicht recht viel weiter....
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

heiliga horsd hat geschrieben:Gibt es noch andere Dinge die "False" sind, nicht dass ich da auf einmal Überraschungen erlebe?
Ja, gibt es: http://docs.python.org/library/stdtypes ... ue-testing
BlackJack

@heiliga horsd: Auf diesen Sonderfall "keine Eingabe" würde ich speziell prüfen *bevor* versucht wird die Eingabe in eine Zahl umzuwandeln.

0 ist keine gute Idee, oder allgemeiner formuliert sollte man es vermeiden Werte aus dem normalen Wertebereich mit Sonderbedeutungen zu belegen. Es kann verwirrend sein wenn man die Sonderwerte nicht ordentlich dokumentiert, wenn man nicht aufpasst wird damit irgendwo gerechnet ohne das es gleich auffällt, und früher oder später macht der Spezialwert plötzlich doch irgendwo als Eingabe Sinn aber man kann ihn nicht verwenden. Für einen "Platzhalter" bietet sich `None` meistens an.

Sonst noch zum Programmschnippsel: Der Datentyp sollte nicht im Bezeichner auftauchen, also in diesem Falle `List` bzw. `Liste`. Wenn man den Typ irgendwann einmal ändert, zum Beispiel weil ein `set()` oder eine Queue effizienter sind, dann muss man entweder überall den Namen anpassen, oder man hat irreführende Namen im Programm.

Ausserdem sollte man zusammengehörige Daten nicht in "parallelen" Listen speichern. `varList` muss in diesem Beispiel vorher mit "sinnlosen" Zahlen belegt sein. Diese Indexe sind wie in den meisten Fällen in Python eine völlig unnötige Indirektion. Dein Beispiel mit angepassten Namen und ohne Index:

Code: Alles auswählen

values = list()
for name in names:
    try:
        values.append(int(input(name)))
    except ValueError:
        values.append(0)
Wobei ich hier stark überlegen würde, ob die Werte nicht besser in einem Dictionary gespeichert werden sollten.
heiliga horsd

Also None, False, Alle Formen von 0, "" () [] und {} sind False, habe ich das richtig verstanden?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

heiliga horsd hat geschrieben:Also None, False, Alle Formen von 0, "" () [] und {} sind False, habe ich das richtig verstanden?
Eine boolsche Abfrage über diese Werte liefert `False`. Im Prinzip her also ja.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
heiliga horsd

Gut, ich denke damit kann ich was anfangen. Danke an alle!
Antworten