Ошибки и отладка: исключения и тестирование
В прошлых уроках вы научились писать программы с переменными, условиями, циклами, структурами данных, функциями, модулями и файлами. На этом шаге вы научитесь спокойно работать с ошибками: понимать сообщения Python, обрабатывать исключения и проверять код тестами. Это сильно ускоряет обучение и делает проекты надёжнее.
Какие бывают ошибки
В учебных проектах чаще всего встречаются три категории.
Синтаксические ошибки: Python не понимает код и даже не запускает программу.
Исключения во время выполнения: программа запустилась, но в процессе что-то пошло не так.
Логические ошибки: программа работает без падений, но результат неправильный.Синтаксическая ошибка
Пример: забыли двоеточие после if.
Python покажет SyntaxError и укажет место, где он перестал понимать программу.
Исключение во время выполнения
Пример: деление на ноль.
Это вызовет ZeroDivisionError.
Логическая ошибка
Пример: формула написана неверно, но ошибок нет.
Такую ошибку Python не распознает автоматически: здесь помогают отладка и тестирование.
Как читать traceback
Когда возникает исключение, Python печатает traceback — “след вызовов”, то есть список мест, через которые программа пришла к ошибке.
Обычно полезно читать traceback снизу вверх.
В самой нижней строке указан тип исключения и сообщение.
Строки выше показывают, в каких файлах и на каких строках происходили вызовы функций.Документация: Ошибки и исключения
!Визуальная подсказка, что главное в traceback находится внизу, а выше — путь вызовов
Исключения: что это такое
Исключение — это специальный объект, который сообщает: “произошла ошибка, дальше обычным способом продолжать нельзя”.
Python поднимает исключения автоматически (например, ValueError, TypeError, FileNotFoundError), а вы можете:
обработать их через try/except
поднять сами через raiseОбработка исключений: try/except
Базовая конструкция:
Как это работает:
Код в try выполняется обычно.
Если внутри try случается исключение указанного типа, выполняется соответствующий except.
Если случилось другое исключение, которого нет в except, программа завершится, и вы увидите traceback.except для нескольких типов
Иногда одинаковая реакция нужна на несколько ошибок.
else и finally
else выполняется, если ошибки не было.
finally выполняется всегда, даже если была ошибка.finally полезен для освобождения ресурсов. Например, файл обычно закрывается автоматически через with open(...), но если вы работаете без with, finally помогает закрыть файл гарантированно.
Когда не стоит ловить исключения
Ловить всё подряд через except Exception: опасно: можно спрятать реальную проблему.
Плохая идея:
Лучше ловить конкретные ошибки, которые вы ожидаете в этом месте.
Как “поднять” исключение: raise
Иногда вы хотите сами запретить некорректные данные. Например, функция работает только с положительными числами.
Это превращает “тихую” ошибку в понятный, управляемый сценарий.
Документация: Оператор raise
Отладка: как искать причину
Приём print-отладки
Самый простой способ — временно вывести значения переменных.
Подход рабочий, но важно потом убрать или аккуратно отключать такие сообщения.
Встроенный отладчик: breakpoint()
В Python можно поставить точку остановки через breakpoint().
После остановки вы можете смотреть значения переменных и выполнять команды построчно.
Документация: pdb — Python Debugger
Тестирование: как проверять код автоматически
Тест — это код, который запускает вашу функцию на известных данных и проверяет, что результат совпадает с ожидаемым.
Тесты полезны, когда:
вы изменяете код и боитесь “сломать” старое поведение
у функции много вариантов входных данных
вы хотите быстрее находить логические ошибкиИдея unit-теста
Unit-тест проверяет маленькую часть программы, обычно одну функцию.
Пример функции, которую будем тестировать:
Мы хотим проверить хотя бы пару случаев: 2 должен быть True, 3 должен быть False.
unittest: стандартная библиотека для тестов
Python содержит модуль unittest.
Документация: unittest — Unit testing framework
Пример: функция и тесты
Файл calc.py:
Файл test_calc.py:
Что здесь важно:
TestCalc — класс с тестами.
Методы, которые начинаются с test_, будут запускаться как тесты.
assertEqual(a, b) проверяет равенство.
assertRaises(...) проверяет, что вызов должен завершиться исключением.Как запускать тесты
Варианты запуска.
Запуск файла напрямую:Запуск через модуль unittest:Чтобы python -m unittest нашёл тесты автоматически, файлы тестов обычно называют test_*.py.
Как связать это с проектами курса
В прошлой статье вы делали мини-проект со списком дел и файлами. Теперь вы можете улучшить его:
использовать try/except, чтобы не падать при неправильном вводе пользователя
писать функции для загрузки и сохранения, а затем проверять их тестами
ловить FileNotFoundError при чтении файла и возвращать пустой список (вы уже видели этот приём)Что дальше
Теперь у вас есть два “страховочных троса” программиста:
исключения помогают делать программы устойчивыми к ошибкам и плохому вводу
тесты помогают сохранять правильность поведения при измененияхНа этой базе удобно переходить к более крупным первым проектам: вы будете писать больше функций, больше сценариев ввода и научитесь поддерживать качество кода без постоянной ручной проверки.