try:
x = 1 / 0
except ZeroDivisionError:
print("Ошибка")
raise ValueError("Ошибка!")
finally:
print("Блок finally")
Сначала будет выполнена строка x = 1 / 0
, что вызовет исключение ZeroDivisionError
.
Сработает блок except ZeroDivisionError
, и в консоль будет выведено "Ошибка".
Затем будет сгенерировано исключение ValueError("Ошибка!")
и выполнена команда raise
, которая "поднимет" это исключение.
После этого выполнится блок finally
, и в консоль будет выведено "Блок finally".
В итоге, программа завершится с необработанным исключением ValueError
, которое выведет трассировку стека (traceback) и сообщение об ошибке.
Этот код демонстрирует работу блоков try
, except
, и finally
в Python.
Разберем построчно:
try:
: Начало блока try
. Внутри этого блока помещается код, который может вызвать исключение.x = 1 / 0
: Эта строка вызывает исключение ZeroDivisionError
, так как происходит деление на ноль.except ZeroDivisionError:
: Этот блок except
перехватывает исключение ZeroDivisionError
. Он будет выполнен, если внутри блока try
возникнет именно это исключение.print("Ошибка")
: Выводит на экран строку "Ошибка". Этот вывод будет выполнен, потому что произошло деление на ноль и ZeroDivisionError
был перехвачен.raise ValueError("Ошибка!")
: Поднимает новое исключение типа ValueError
с сообщением "Ошибка!". Важно отметить, что это исключение поднимается *после* обработки ZeroDivisionError
.finally:
: Этот блок finally
выполняется *всегда*, независимо от того, было ли выброшено исключение и было ли оно перехвачено.print("Блок finally")
: Выводит на экран строку "Блок finally". Этот вывод будет выполнен в любом случае.Результат выполнения:
Программа сначала выведет "Ошибка", так как блок except
перехватил ZeroDivisionError
. Затем будет поднято исключение ValueError
. После этого, *перед* тем как исключение ValueError
покинет область видимости, будет выполнен блок finally
, который выведет "Блок finally". Наконец, исключение ValueError
останется необработанным и приведет к завершению программы с ошибкой, если не будет поймано выше по стеку вызовов.
Вывод на консоль:
Ошибка
Блок finally
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
ValueError: Ошибка!