Найти тему
programmer's notes (python and more)

ООП на Python. Обработка ошибок в Python. Приложение 1 к видео 14

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes.

Рекомендую пройти по этим ссылкам

Теперь в Дзен есть Подборки. Данная статья относится к подборке

ООП в Python
programmer's notes

Приложение 1 к видеоуроку

Обработка ошибок в Python

Ручная обработка

Ошибки в программировании это целая наука. Все ошибки разбиваются на группы, т.е. классифицируются. Среди программных ошибок обычно выделяют исключения. Как правила исключения приводят прекращению работы программы. Типичными примерами исключений являются деления на 0, выход за границы индекса, некорректный вызов стандартных функций, обращение к несуществующему файлу и т.д. Разумеется, все эти ситуации можно корректно обойти дополнительной проверкой: проверка знаменателя на нуль, получения длины списка, проверка типа параметров функции, проверка существования файла и т.п. В современных реализациях языков программирования обычно имеется механизм, позволяющий автоматизировать и упростить обработку таких исключений. Кроме того, программист получает возможность создавать обработку, определяемых им самим ошибок, т.е. создавать свои собственные исключения.

Рассмотрим пример, когда есть целая цепочка функций, вызывающих друг друга. Ошибка-исключение при этом может произойти на разных уровнях вызова.

Текст программы см. ниже
Текст программы см. ниже
primer30.py

Обратим внимание, что исключение может произойти не только в функции f1() и которое мы обходим проверкой знаменателя, но и в функции f3(), при вводе чисел (если ввести не число). Принцип обработки ошибок в такой ситуации заключается в том, что функция должна возвращать некий результат её выполнения. В том числе и код ошибки, если таковая произошла. В нашем случае нужно отслеживать такой код на каждом уровне цепочки вызовов.

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

Текст программы см. ниже
Текст программы см. ниже
primer31.py

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

Специальная структура для обработки исключений

Ниже представлена программа, в которой используется специальные операторы для обработки исключений:

  • раздел try — часть кода, в которой по предположению могут возникнуть обрабатываемые данным оператором ошибки;
  • раздел except — сюда передаётся управление, если возникает ошибка;
  • раздел else — раздел обрабатывается, если ошибки не было;
  • раздел finally — код в этом разделе выполняется при любом исходе.

Разделы else и finally не обязательны.

Текст программы см. ниже
Текст программы см. ниже
primer32.py

отметим, что в разделе try могут быть несколько источников исключения. В нашем случае туда можно поместить и строку

a, b = map(int, input().split())

которая также может быть источником исключения. Если в вашей программе есть длинная цепочка вызывающих друг друга функций, а исключение может произойти на любом уровне вызова, то это не помешает оператору try определить наличие исключения. См. пример ниже.

Текст программы см. ниже
Текст программы см. ниже
primer34.py

try отлавливает и ошибку деления на 0 и ошибку выполнения функции map.

Замечание 1
После слова except можно указывать класс отлавливаемых ошибок. Классы можно создавать самому. Мы обратимся к этим вопросам в следующем текстовом приложении к уроку 14.

Замечание 2
В нашем примере будут обрабатываться все возникающие исключения. Документация также рекомендует писать в этом случае "except Exception:" вместо простого "except:". Но оба варианта в принципе равнозначны.

Использование исключений в некоторых методах

Методы некоторых стандартных объектов Python используют исключения для сообщения от отрицательном результате. Это называется ещё "бросить" исключение. Рассмотрим следующий пример.

Текст программы см. ниже
Текст программы см. ниже
primer33.py

Результат выполнения программы (функция "бросила" исключение)

4 is not in list

Т.е. числа 4 нет в списке. Если написать, например i = ls.index(3), то результатом выполнения программы будет просто

2

Обращаю внимание, на строку except Exception as e:. e — создаваемый объект, содержащий информацию об исключении. Берём на вооружение.

На этом я не заканчиваю свой рассказ об обработке исключений. В следующем приложении я продолжу эту интереснейшую тему.

Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Попробуйте пройти между Сциллой и Харибдой того, что вам говорят "как надо программировать" и тем что вы сами чувствуете "КАК". Если вы ничего не чувствуете, то может быть программировать это не ваше дело.
Попробуйте пройти между Сциллой и Харибдой того, что вам говорят "как надо программировать" и тем что вы сами чувствуете "КАК". Если вы ничего не чувствуете, то может быть программировать это не ваше дело.