Python Frage zu While Schleife bzw. zu try / except?
Hallo.
Ich habe gerade eine kleine Denkblockade.
Ich möchte eine Programm immer wieder von vorne starten bis ich mit einer Eingabe das Programm beende. Das funktioniert mir auch Grundsätzlich mit der While Schleife.
Was mir nicht funktioniert ist das es in den Except-Block springt sobald im Try-Block was schief gelaufen ist.
Hab versucht das mit einem einfachem Code darzustellen:
if __name__ == '__main__':
while_option = True
while while_option:
option = int(input('1, 2 oder 3'))
try:
if option == 1:
print("option 1")
a = int(input('Gib eine Zahl ein!'))
elif option == 2:
print("option 2")
elif option == 3:
print("option 3 ist beenden")
while_option = False
except BaseException as err:
print("except / BaseException" + err)
except ValueError as err:
print("except / ValueError" + err)
except:
print('einfach except')
Zur Erklärung:
Bei Programm Start kommt die Frage 1, 2 oder 3. Bei 1 und 2 startet es von vorne und bei 3 wird es beendet. Soweit so gut und auch gewünscht.
Nur ich dachte jetzt wenn in der Variable a was falsches eingegeben wird dass ich das mit einem except abfangen kann, aber dem ist nicht so.
Was verstehe ich da falsch?
Bzw. Wie könnte man dann so einen Fehler abfangen?
Vielen Dank im Voraus
1 Antwort
Meinst du mit "etwas falsches" dass keine Zahl eingegeben wird? Dafür muss der betreffende Code - also der input bzw. die Typkonvertierung - auch innerhalb des try-Blocks stehen. Wenn du die Zeile, in der "option" definiert wird also einfach eine Zeile weiter runter schreibst wird es funktionieren...
Du hast dann aber nur das abgefangen, was nicht in einen Integer konvertierbar ist. Für zu große oder zu kleine Zahlen würde sich dann ein else-Block anbieten...
Ja, wie gesagt kannst du den Fehler nicht abfangen, wenn der betreffende Code außerhalb des try-blocks ist... Das, wo der Fehler auftritt (in diesem Fall die Konvertierung eines Strings in einen Integer) muss innerhalb eines Try-blockes sein, anderenfalls kann es nicht abgefangen werden...
Also müsste ich um die if's jeweils nochmal einen try except Block machen.
So wie der Code jetzt ist kann es also gar nicht dazu kommen dass eines der except ausgelöst wird, oder? Sehe ich das richtig?
Also müsste ich um die if's jeweils nochmal einen try except Block machen.
Nein, die sind ja schon im try-block. Das einzige was du tun musst ist, die Zeile, in der du die Konvertierung vornimmst - in diesem Fall die vierte - mit in den try-Block zu nehmen. In dieser Zeile entsteht der Fehler, und nur wenn der Fehler innerhalb eines Try-Blockes entsteht, kann er abgefangen werden. Es müsste also so aussehen:
if __name__ == '__main__':
while_option = True
while while_option:
try:
option = int(input('1, 2 oder 3')) # Hier entsteht der Fehler. Deshalb muss diese Zeile innerhalb des Try-Blocks sein
if option == 1:
print("option 1")
a = int(input('Gib eine Zahl ein!'))
[...]
So wie der Code jetzt ist kann es also gar nicht dazu kommen dass eines der except ausgelöst wird, oder? Sehe ich das richtig?
Es könnte ein catch-Block ausgelöst werden, jedoch nur wenn ein entsprechender Fehler innerhalb des zugehörigen Try-Blockes entsteht. Und bei dem Code der jetzt im Try-Block steht ist das nicht möglich, genau (weil der sensible Code darüber steht)...
Das ist ja nur ein Beispiel. Der Code in dem ich das Problem habe ist viel zu lang um ihn hier zu schreiben.
In diesem Beispiel (das ich vermute was etwas ähnlichkeit mit meinem Problem hat) hab ich das so gemeint:
Zuerst kommt die Frage:
Da gebe ich dann 1 ein (was ja richtig ist und zu option 1führt.
Dann kommt die Frage:
Da geht es jetzt nicht speziell um einen Integer-Fehler im Orginal-Code. Das ist nur ein einfaches Beispiel wie man einen Fehler erzeugt.
Wenn ich da jetzt keine Zahl eingebe, sondern z.b. ein "a", dann dachte ich dass der except-Block mit dem ValueError oder der BaseException kommt und dann der jeweilige String mit der Variable "err" ausgegeben wird und dann weiß ich nicht, aber auf jeden Fall dachte ich dass das Programm da dann nicht abstürzt, weil man ihn mit except abgefangen hat.
Kannst du mir da sagen wo mein Denkfehler liegt?