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):
    pass

def 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 logging

logging.basicConfig(level=logging.INFO) logging.info('Программа запущена') logging.warning('Это предупреждение!') logging.error('Произошла ошибка!')

  • INFO — общая информация.
  • WARNING — предупреждения.
  • ERROR — ошибки.
  • DEBUG — подробная отладочная информация.

6. Логирование в файл

Можно направить логи не только в консоль, но и в файл.

import logging

logging.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 logging

logging.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.
  • Создавать собственные классы ошибок.
  • Писать логи в консоль и в файлы.
  • Настраивать уровни логирования и формат сообщений.