Почему, наконец, выполняется, хотя мы продолжаем в блоке кроме, который передает управление в верхнюю часть времени? - PullRequest
0 голосов
/ 15 апреля 2020

Вот код

while True:
   try: 
     age = int(input("Enter your age"))
   except ValueError:
     print("Enter the age in integer")
     continue
   except ZeroDivisionError:  #when trying to divide the age for an age groups
     print("Age cannot be zero")
     continue
   else:
     print("thank you!!")
     break
   finally:
     print("ok! I am finally done")

На входе для возраста я даю строку (например: wefervrsvr), поэтому она должна go через ValueError в блоке исключений, который имеет print function, а затем continue оператор, который делает управление программой наверху в l oop, поэтому он снова запрашивает у нас ввод, но здесь я не понимаю, почему, наконец, выполняется перед управление переходит, чтобы попробовать блок сверху, как я вижу в выводе

Ответы [ 3 ]

4 голосов
/ 15 апреля 2020

Из python docs:

Когда выполняется оператор return, break или continue в наборе try оператора try ... finally, предложение finally также выполняется «на выходе».

«на выходе» в основном означает, что если оператор continue выполняется внутри предложения исключения, код в предложении finally будет выполнен, а затем l oop перейдет к следующей итерации.

2 голосов
/ 15 апреля 2020

Блок finally существует, чтобы гарантировать, что вы можете выполнить некоторый код, независимо от того, что происходит в блоке try. Ключевое слово continue не обойдет его, и даже необработанное исключение не обойдет его.

Если вы, например, удалили этот улов ValueError, вы все равно попадете в блок finally:

try:
    raise ValueError("unhandled exception type");
except ZeroDivisionError:
    print("problems.")
finally:
    print("will print, even in the face of an unhandled exception")
0 голосов
/ 15 апреля 2020

Приличный ответ на это

import time;
while True:
    try:
        print("waiting for 10 seconds...\n")
        continue
        print("never show this")
    finally:
        print("Finally starts executing\n");
        time.sleep(10)
        print("\nFinally ends executing control jumps to start of the loop");
...