04. Логирование и обработка ошибок
Логирование и обработка ошибок
Описание: В этом уроке вы узнаете, как обрабатывать ошибки в Python правильно, не прерывая выполнение программы, и как использовать модуль logging для записи сообщений о работе вашего приложения. Это важный шаг к созданию надёжного, профессионального кода.1. Что такое исключения
Исключения — это ошибки, которые возникают во время выполнения программы. Например:
print(10 / 0) # Ошибка ZeroDivisionError
Чтобы программа не «падала», нужно перехватывать ошибки.
2. Обработка ошибок с помощью try/except
Используем конструкцию try/except:
try:
x = int(input('Введите число: '))
print('Результат:', 10 / x)
except ZeroDivisionError:
print('Нельзя делить на ноль!')
except ValueError:
print('Введите число, а не текст!')
- Блок try — код, который может вызвать ошибку.
- Блок except — обработчик ошибки.
- Можно добавлять несколько типов ошибок подряд.
3. Блоки else и finally
try:
f = open('data.txt', 'r', encoding='utf-8')
except FileNotFoundError:
print('Файл не найден!')
else:
print('Файл успешно открыт!')
f.close()
finally:
print('Этот код выполняется всегда.')
- else выполняется, если ошибок не было.
- finally выполняется всегда — даже при ошибках (например, закрывает соединение).
4. Создание собственных исключений
Вы можете создавать свои типы ошибок для специфических ситуаций.
class NegativeValueError(Exception):
passdef square_root(x):
if x < 0:
raise NegativeValueError('Нельзя брать корень из отрицательного числа!')
return x ** 0.5
try:
print(square_root(-9))
except NegativeValueError as e:
print('Ошибка:', e)
Такой подход используется в библиотеках и крупных проектах для более точного контроля ошибок.
Логирование (logging)
Логирование — это запись событий программы в файл или консоль для диагностики, мониторинга и отладки.5. Простейший пример логирования
import logginglogging.basicConfig(level=logging.INFO)
logging.info('Программа запущена')
logging.warning('Это предупреждение!')
logging.error('Произошла ошибка!')
- INFO — общая информация.
- WARNING — предупреждения.
- ERROR — ошибки.
- DEBUG — подробная отладочная информация.
6. Логирование в файл
Можно направить логи не только в консоль, но и в файл.
import logginglogging.basicConfig(
filename='app.log',
level=logging.DEBUG,
format='%(asctime)s [%(levelname)s] %(message)s',
encoding='utf-8'
)
logging.info('Программа запущена')
logging.warning('Проверьте данные')
logging.error('Ошибка соединения с сервером')
Результат в app.log:
2025-10-23 21:00:00 [INFO] Программа запущена
2025-10-23 21:00:01 [WARNING] Проверьте данные
2025-10-23 21:00:02 [ERROR] Ошибка соединения с сервером
7. Формат сообщений и уровни логирования
Можно гибко настроить вывод.
logging.basicConfig(
format='%(asctime)s | %(levelname)s | %(name)s | %(message)s',
level=logging.INFO
)
Параметры:
- %(asctime)s — время события.
- %(levelname)s — уровень сообщения.
- %(message)s — текст.
8. Использование именованных логгеров
Можно создавать отдельные логгеры для разных модулей:
logger = logging.getLogger('auth')
logger.setLevel(logging.DEBUG)logger.info('Пользователь вошёл в систему')
logger.error('Неверный пароль')
9. Мини-проект: логирование работы калькулятора
Создадим файл calc.py:
import logginglogging.basicConfig(
filename='calc.log',
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
encoding='utf-8'
)
def divide(a, b):
try:
result = a / b
logging.info(f'Деление {a} / {b} = {result}')
return result
except ZeroDivisionError:
logging.error('Попытка деления на ноль!')
return None
print(divide(10, 2))
print(divide(5, 0))
10. Просмотр логов и анализ
После запуска создастся файл calc.log, где будут записи всех действий:
2025-10-23 21:05:00 [INFO] Деление 10 / 2 = 5.0
2025-10-23 21:05:01 [ERROR] Попытка деления на ноль!
11. Советы по организации логов
- Разделяйте логи по типам: ошибки, запросы, действия пользователей.
- Используйте уровень DEBUG для отладки и INFO для реальных запусков.
- Регулярно очищайте или архивируйте старые лог-файлы.
Итоги урока
Теперь вы умеете:- Обрабатывать исключения с помощью try/except/else/finally.
- Создавать собственные классы ошибок.
- Писать логи в консоль и в файлы.
- Настраивать уровни логирования и формат сообщений.