Какой блок будет выполнен, если ошибка возникла в блоке `try`?

Если ошибка возникает в блоке try, выполнение кода немедленно переходит к блоку except, соответствующему типу ошибки. Если подходящий блок except найден, он выполняется. Если блок finally присутствует, он выполняется в любом случае, после except (если он был вызван) или после try (если ошибки не было).

Когда ошибка возникает в блоке try, последовательность выполнения следующая:
  1. Прерывание выполнения блока try: Немедленно после возникновения исключения выполнение кода внутри блока try останавливается в точке возникновения исключения. Оставшаяся часть кода внутри блока try не выполняется.
  2. Передача управления блоку except: Python ищет блок except, который может обработать возникшее исключение.
  3. Сопоставление типа исключения: Каждый блок except обычно указывает тип исключения, который он обрабатывает (например, ValueError, TypeError, IOError). Python проверяет, совпадает ли тип возникшего исключения с типом, указанным в блоке except.
  4. Выполнение соответствующего блока except: Если найден блок except, который соответствует типу исключения, выполняется код внутри этого блока. Внутри блока except можно выполнить обработку исключения, логирование, или другие необходимые действия.
  5. Выполнение блока finally (если есть): Независимо от того, было ли выброшено исключение в блоке try или нет, и было ли оно обработано блоком except или нет, блок finally (если он присутствует) всегда выполняется. Блок finally обычно используется для очистки ресурсов, таких как закрытие файлов или сетевых соединений.
  6. Продолжение выполнения программы: После выполнения блока except или finally (или, если ни того, ни другого нет, после возникновения необработанного исключения), программа пытается продолжить выполнение с точки, следующей за блоком try...except...finally. Однако, если исключение не было обработано (то есть, нет подходящего блока except), программа завершается с ошибкой.
Пример:

try:
    # Код, который может вызвать исключение
    result = 10 / 0  # Вызывает ZeroDivisionError
    print("Этот код не выполнится")
except ZeroDivisionError:
    # Обработка исключения ZeroDivisionError
    print("Попытка деления на ноль!")
finally:
    # Этот блок выполнится всегда
    print("Блок finally выполнен.")

print("Программа продолжает выполнение после try...except...finally")
    
В этом примере, при попытке деления на ноль возникнет ZeroDivisionError. Выполнение кода в блоке try остановится. Затем будет выполнен блок except ZeroDivisionError, и на экран будет выведено сообщение "Попытка деления на ноль!". После этого будет выполнен блок finally, и будет выведено сообщение "Блок finally выполнен.". Наконец, программа продолжит выполнение и выведет сообщение "Программа продолжает выполнение после try...except...finally".
0