Представьте, что вы пишете программу для интернет-магазина. Пользователь вводит количество товара, а программа рассчитывает стоимость. Что произойдет, если пользователь введет не число, а буквы? Или если пользователь захочет купить -5 товаров? Или если файл с ценами не найден на диске? В реальных программах ошибки неизбежны: пользователи вводят некорректные данные, файлы не находятся, сетевые соединения обрываются, на диске заканчивается место. Программа, которая просто вылетает при первой ошибке с непонятным сообщением об ошибке, непригодна для использования. Пользователь не поймет, что произошло, и просто закроет программу. Именно для того, чтобы программы могли корректно реагировать на ошибки и продолжать работу, в Python существует механизм обработки исключений.
В этом уроке мы подробно изучим обработку исключений — мощный механизм, позволяющий программе перехватывать ошибки, выполнять альтернативные действия и продолжать работу. Вы узнаете, что такое исключения, как они возникают, и как их перехватывать с помощью конструкции try-except. Когда Python встречает ошибку, он создает объект исключения и "возбуждает" его. Если исключение не обработано, программа завершается с сообщением об ошибке (трассировкой). Но если мы предвидим возможность ошибки и помещаем опасный код в блок try, а в блоке except описываем, что делать при ошибке, программа продолжит работу.
Вы научитесь обрабатывать разные типы исключений по отдельности, чтобы на каждую ошибку реагировать по-своему. Например, на ZeroDivisionError (деление на ноль) можно выводить сообщение "Деление на ноль невозможно", на ValueError (неправильное значение) — "Пожалуйста, введите число", на FileNotFoundError — "Файл не найден, проверьте путь". Такой подход делает программу дружелюбной к пользователю и профессиональной.
Мы подробно разберем все основные типы встроенных исключений. ValueError возникает, когда функция получает аргумент правильного типа, но с некорректным значением (например, попытка преобразовать строку "abc" в число). TypeError возникает при операции с несовместимыми типами (например, сложение числа и строки). IndexError возникает при обращении к индексу списка, выходящему за его пределы. KeyError возникает при обращении к несуществующему ключу словаря. ZeroDivisionError возникает при делении на ноль. FileNotFoundError возникает при попытке открыть несуществующий файл. ImportError возникает, когда не удается импортировать модуль. Вы научитесь перехватывать несколько исключений одним блоком except, указывая их в виде кортежа, а также обрабатывать их по отдельности в разных блоках.
Изучим блок else, который выполняется только если исключение не возникло. Это идеальное место для кода, который должен работать только при успешном выполнении блока try. Например, после успешного открытия файла мы можем читать из него, а код закрытия файла лучше поместить в finally. Познакомимся с блоком finally, который выполняется всегда, независимо от того, было исключение или нет. Это незаменимо для освобождения ресурсов: закрытия файлов, сетевых соединений, освобождения памяти, закрытия подключений к базам данных.
Также научимся поднимать исключения с помощью оператора raise. Это позволяет создавать собственные проверки и сигнализировать об ошибках в своих функциях. Например, функция, которая вычисляет квадратный корень, может проверить, что аргумент неотрицательный, и если это не так — поднять исключение ValueError с понятным сообщением. Вы узнаете, как создавать свои собственные классы исключений, наследуясь от встроенного класса Exception. Это позволяет создавать иерархию ошибок для больших проектов и обрабатывать их более точно.
Все примеры будут максимально практичными: безопасное преобразование пользовательского ввода в число с обработкой ValueError, безопасное деление с защитой от ZeroDivisionError, работа со словарями с проверкой существования ключей, чтение файлов с обработкой FileNotFoundError и PermissionError, создание функций с валидацией входных данных и поднятием исключений. К концу урока вы будете писать надежные программы, которые не падают при ошибках, а корректно информируют пользователя и продолжают работу, что является признаком профессионального кода.