Problem mit try und if

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
nevergod
User
Beiträge: 46
Registriert: Mittwoch 22. September 2010, 13:22

Guten Tag,
ja ich bins wieder :lol:
Nach 4 Stündigem rumprobieren und rumbasteln konnte ich das nicht beheben.
Diesmal habe ich folgendes Problem.

Code: Alles auswählen

while True:
    try:
        verz = raw_input("Hier eingeben :")
        if verz == 'close':
            sys.exit()
        elif verz == 'neu':
            print "Bitte geben sie den Namen ein den"
            vname = raw_input("Ihr Verzeichnis tragen soll :")
            writefile = open("bin/%s.txt" % vname,'a')
            x = open("bin/verzeichnisse.txt",'a')
            y = x.write("%s" % vname)
            print "Erfolg! Enter drücken um das Programm neu zu starten!"
            msvcrt.getch()
            sys.exit()
    except:
        print "Bitte nur den genauen Verzeichnisnamen angeben!"
    else:
        break


so. Wenn ich nun close eingebe tritt anstatt der if Fall der except Fall ein. Gebe ich irgendwas ein was normalerweise den except Fall auslösen sollte, wird der Loop gebrochen und der rest des Codes ausgeführt. Gebe ich den elif Fall ein (neu) wird der elif Fall auch ausgeführt.

Mir erscheint das alles doch recht merkwürdig. Habe das ganze schon mindestens 3 mal neu geschrieben und das einzige was ich bezwecken konnte war das wenn ich etwas eingebe ein anderer falscher Fall ausgelöst wird.

Wo steckt diesmal der teufel drinne? :S
Tut mir leid euch so oft zu belästigen.

mfG. NeverGod
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Zweiter Satz. Und damit hast du genau den Grund getroffen, warum man nie ein leeres except verwendet, sonder immer die Ausnahmen angibt, welche behandelt werden sollen.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich kann Deine Fehlerbeschreibung nicht nachvollziehen! Allerdings ergeben sich die Fehler ggf. gar nicht, wenn man den Code ein wenig aufräumt und pythonischer gestaltet.

1.) Dateien sollten immer geschlossen werden. Daher öffnet man diese mit dem with-Statement:

Code: Alles auswählen

with open(...) as infile:
    # infile ist file objekt
Dadurch wird infile immer geschlossen, auch wenn eine Exception auftritt.

2.) Man sollte immer konkrete Excpetions abfangen, z.B. einen "IOError" o.ä. So wird Dir nicht auffallen, wenn etwas nicht geplantes auftritt.

3.) Überlege Dir noch einmal (bzw. beschreibe uns das), was Du genau machen möchtest. Mir nicht klar, wieso Du die Persistenz direkt an die Eingabe heftest.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nevergod
User
Beiträge: 46
Registriert: Mittwoch 22. September 2010, 13:22

also,

Man wird aufgefordert etwas einzugeben (einen Verzeichnisnahmen).

Wird dieser eingegeben wirid dieses geöffnet. (anderer teil des scripts nicht in diesem post)
gibt man eins ein was nicht existiert trifft except ein (funktioniert nicht)
gibt man close ein wird das programm einfach geschlossen (funktioniert nicht)
gibt man neu ein wird man aufgefordert nen namen einzugeben, danach wird ne datei mit diesem namen erstellt und der name wird in eine txt datei geschrieben (funktioniert)

mein problem nun. wenn ich close eingebe wird einfach nur except ausgeführt.
wenn ich nen fehler verursache (ein pfad angebe der nicht da ist) wird die schleife übersprungen und das script geht weiter
BlackJack

@nevergod: Du versuchst Programmablaufsteuerung mit Ausnahmebehandlung zu machen, die auf dieser Ebene nicht funktioniert bzw. wenn dann nur zufällig, bzw. zu viel "Angriffsfläche" für fehlerhafte, ungewollte Abläufe bietet.

Für meinen Geschmack machst Du da auch viel zu viel was man in Funktionen aufteilen sollte.

Wenn Du ein wenig Detektivarbeit mit ``print`` machen würdest, wäre Dir wahrscheinlich auch selber schon aufgefallen, dass bei der Eingabe von 'close' der ``if``-Zweig auch tatsächlich ausgeführt wird und auch das ``sys.exit()`` auch wirklich ausgeführt wird. *Das* ist allerdings über eine Ausnahme implementiert und die fängst Du ab, weil Dein blankes ``except:`` ohne konkrete Ausnahmen *alle* Ausnahmen "behandelt" -- eben auch den `SystemExit` der von `sys.exit()` kommt.
nevergod
User
Beiträge: 46
Registriert: Mittwoch 22. September 2010, 13:22

danke für die vielen Ratschläge!

habe es mal so umgeschrieben und jetzt läuft es.

Code: Alles auswählen

while True:
    try:
        verz = raw_input("Hier eingeben :")
    except IOError:
        print "Bitte nur den genauen Verzeichnisnamen angeben!"
        
    else:
        break
while True:
    if verz == 'close':
        sys.exit()
        
    elif verz == 'neu':
        print "Bitte geben sie den Namen ein den"
        vname = raw_input("Ihr Verzeichnis tragen soll :")
        writefile = open("bin/%s.txt" % vname,'a')
        x = open(Quelle,'a')
        y = x.write("\n")
        y = x.write("%s" % vname)
        print "Erfolg! Enter drücken um das Programm neu zu starten!"
        msvcrt.getch()
        sys.exit()

    else:
        for i in range(50):   
            print ""
        break
x = open("bin/%s.txt" % verz, 'r')
aber ich weiß nicht wirklich wie man except deklariert (bin noch neuling), denn mit except IOError klappt es ja nicht. Was müsste da stehen damit er den fall bei IOError 2 aufruft?

vielen dank nochmal
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

nevergod hat geschrieben:

Code: Alles auswählen

while True:
    try:
        verz = raw_input("Hier eingeben :")
    except IOError:
        print "Bitte nur den genauen Verzeichnisnamen angeben!"
[...]
aber ich weiß nicht wirklich wie man except deklariert (bin noch neuling), denn mit except IOError klappt es ja nicht.
Du musst den Fehler da abfangen wo er auftreten kann. Bei einer Eingabe mit raw_input() ist kein IOError zu erwarten.
nevergod
User
Beiträge: 46
Registriert: Mittwoch 22. September 2010, 13:22

Gut vielen Dank euch :D habe es nun fehlerfrei zum laufen bekommen!
Antworten