Прямое практическое продолжение честного разговора из главы 05: интерпретируемый язык обнаруживает многие ошибки только в момент выполнения конкретной строки — здесь про то, как реагировать на это осознанно, а не наблюдать, как программа просто падает.
Когда в Python что-то идёт не так во время выполнения, поднимается исключение (exception) — объект, описывающий конкретную проблему. Если его никто не перехватывает, оно "поднимается" вверх по цепочке вызовов функций и в итоге аварийно останавливает программу, печатая сообщение об ошибке (traceback, разбирается ниже).
Код внутри try выполняется как обычно; если внутри него возникает исключение
указанного типа, выполнение сразу переходит в блок except, а не аварийно
останавливает всю программу.
| Исключение | Когда возникает |
|---|---|
| ValueError | Значение не подходит по смыслу — например, int("abc") из главы 14 |
| TypeError | Операция применена к несовместимым типам — например, попытка сложить строку и число напрямую (глава 14) |
| FileNotFoundError | Попытка открыть несуществующий файл (глава 19) |
| ZeroDivisionError | Деление на ноль |
| IndexError | Индекс списка за пределами его длины (глава 17) |
| KeyError | Обращение к несуществующему ключу словаря (глава 17) |
| UnicodeDecodeError | Несовпадение реальной и указанной кодировки файла (главы 03, 18, 19) |
Конструкция except: без указания конкретного типа перехватывает буквально
любое исключение — включая те, которые на самом деле стоило бы заметить и исправить, а
не молча проглотить. Это маскирует настоящие ошибки в коде, выдавая видимость "программа
работает", хотя на деле она просто скрывает проблему. Указывай конкретный тип исключения,
который действительно ожидаешь и умеешь корректно обработать.
else выполняется только при отсутствии исключения, finally —
всегда, независимо от того, было исключение или нет — удобно для гарантированной "уборки"
(например, закрытия ресурса), хотя для файлов, как уже говорилось в главе 19, эту роль чаще
берёт на себя with.
Собственная функция может сознательно "поднять" исключение, если получила данные, с
которыми не может корректно работать — явный сигнал вызывающему коду о проблеме, вместо
молчаливого продолжения работы с некорректными данными. Более сложные проекты иногда
определяют собственные классы исключений (тема пересекается с главой 24 про классы) — для
задач этой книги достаточно поднимать уже существующие подходящие по смыслу типы вроде
ValueError.
Самая важная информация — в самом низу: тип исключения и сообщение
(ZeroDivisionError: division by zero). Выше — цепочка вызовов, приведшая к
этой ошибке, начиная с самого раннего вызова наверху и заканчивая точным местом, где
ошибка реально произошла, ближе к низу. В этом примере видно: строка 7 вызвала функцию
divide, а уже внутри неё, на строке 3, произошло деление на ноль. Умение
быстро находить в этом стеке именно свою строку кода (а не строку внутри стандартной
библиотеки или сторонней библиотеки) — практический навык, который приходит с опытом
чтения таких сообщений.
Следующая глава — файловая система из Python напрямую (os, pathlib): прямое практическое продолжение и терминальных команд блока 2, и темы файлов из главы 19, теперь уже без выхода в терминал вообще, а изнутри самого кода.
Книга бесплатна для чтения. Автор — Тариел Бежанидзе, компьютерный мастер в Батуми · tariel.ge · все бесплатные книги. Копировать текст целиком на другие сайты — только со ссылкой на источник.