Инструкция обработки исключений

Исключение (программная ошибка) - это объект python, который характеризуется типом и текстом исключения.

Возбуждение, перехват и обработка исключений (ошибок) это фундаментальная часть работы Python. Обработчики исключений помогают сделать программный код более удобочитаемым, отделяя "исключительные" случаи.

Возбуждение исключений

Исключения представляют собой удобное средство управления потоком выполнения. Мы можем пользоваться этим, используя или встроенные исключения или создавая свои собственные и возбуждая их когда нам это нужно.

Чтобы возбудить исключение используется инструкция raise:

raise < exception >
raise Exception('Вот тут ошибочка вышла =(')
Мы явно указываем какое именно исключение мы хотим возбудить, оно должно быть встроенным или нашим собственным (унаследованным от класса Exception). Исключение принимает один необязательный аргумент - текст ошибки. Список всех встроенных исключений https://docs.python.org/3/library/exceptions.html

Для повторного возбуждения исключения нужно вызвать инструкцию raise без указания исключения, тогда будет возбуждено предыдущее исключение.
raise Exception('Исключение №1')
raise # повторное возбуждение исключения №1
Иерархия исключений
Создание собственных исключений на данном этапе курса рассматриваться не будет, т.к. оно затрагивает ООП и работу с классами, которые нам еще предстоит изучить.
Перехват и обработка исключений
Перехватывать исключения можно составной инструкцией try / except:

Простейшая структура инструкции:

try: < блок инструкций try >
except: < блок инструкций except >

Описание:

  • При возбуждении исключения в < блок инструкций try > выполнение инструкций прерывается и управление сразу передается в < блок инструкций except >;
  • Если в < блок инструкций try > исключения не возникает, то < блок инструкций except > пропускается
Расширенная структура инструкции:
try: < блок инструкций try >
except <Exception 1> as <variable 1>:
< блок инструкций except 1 >
except (<Exception 2>, <Exception 3>) as <variable 2>:
< блок инструкций except 2 >
...
except <Exception N> as <variable N>:
< блок инструкций except N >

Описание:

  • Данная структура предполагает что в < блок инструкций try > могут возбуждаться разные исключения и для каждого вида исключения определен отдельный <блок инструкций except> в который передается объект исключения через соответствующую переменную < variable >;
  • Если в < блок инструкций try > исключения не происходит, то все < блок инструкций except > будут пропущены;
  • Исключения можно группировать и назначать на них один < блок инструкций except >;
Полная структура инструкции:
try: < блок инструкций try >
except <Exception 1> as <variable 1>:
< блок инструкций except 1 >
...
except <Exception N> as <variable N>:
< блок инструкций except N >
else:
< блок инструкций else >
finally:
< блок инструкций finally >

Описание:

  • < блок инструкций else > выполняется когда < блок инструкций try > завершается без возбуждения исключений
  • < блок инструкций finally > выполняется всегда независимо было исключение или нет
Если исключение возникает в < блок инструкций except > или не находится обработчика except для конкретной ошибки то интерпретатор Python начинает подъем вверх по стеку вызовов, пытаясь отыскать подходящий обработчик исключения. Если такой обработчик не будет найден то программа завершит свою работу с выводом диагностической информации и сообщения об ошибке.

Еще один вариант структуры:

try: < блок инструкций try >
finally: < блок инструкций finally >

Независимо от того возникнет исключение в < блок инструкций try > или нет, < блок инструкций finally > всегда будет выполнен и только потом интерпретатор Python начинает подъем вверх по стеку вызовов, пытаясь отыскать подходящий обработчик исключения.