Управление исключениями в языке Python с помощью библиотек
Эффективные подходы к управлению ошибками в Python
Как сделать централизованное логирование ошибок с полной трассировкой и временем?
Наиболее эффективное решение основывается на комбинации модулей logging и traceback. Оно позволяет записывать все исключения в файл или стрим, добавлять метки времени, уровень важности и форматировать вывод. Цель: сохранить историю ошибок для последующего анализа без остановки программы.
Особенности:
- Используется logger.exception() внутри блока except, который автоматически добавляет информацию о текущем исключении.
- Настройка обработчика (handler) и форматтера позволяет гибко управлять выводом.
- Поддерживается ротация файлов (RotatingFileHandler) для предотвращения переполнения диска.
import logging
import traceback
logging.basicConfig(
level=logging.ERROR,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('errors.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
try:
1 / 0
except ZeroDivisionError:
logger.exception('Произошла ошибка деления на ноль')Errors python library (библиотека для обработки ошибок в python)
2025-03-27 10:15:30,123 - __main__ - ERROR - Произошла ошибка деления на ноль
Traceback (most recent call last):
File "test.py", line 12, in <module>
1/0
ZeroDivisionError: division by zeroбиблиотеки python для создания программ (библиотеки python для создания программ)
Проблемы: Если обработчик не сконфигурирован, сообщения могут потеряться. При многопоточности нужно использовать потокобезопасные обработчики. Некорректная кодировка в файле может исказить русский текст.
Как написать минимальную обработку ошибок без внешних библиотек?
Цель: быстрая отладка скрипта. Используется блок try/except с выводом в консоль через print. Подходит для простых скриптов и однократного запуска.
try:
int('abc')
except ValueError as e:
print('Ошибка:', e)
как добавить модуль в программу python (как добавить модуль в программу на python)
Как получить подробную трассировку стека ошибки?
Модуль traceback даёт возможность извлекать форматированный стек вызовов. Цель: отладка сложных сценариев, где нужен полный путь к ошибке.
import traceback
try:
raise ValueError('Что-то пошло не так')
except ValueError:
traceback.print_exc()
# или сохранить в строку
tb_str = traceback.format_exc()
print('Сохранено:', tb_str[:50])
Как улучшить читаемость исключений с цветовой подсветкой?
Библиотека better_exceptions расширяет стандартные трейсбеки, добавляя цвет и дополнительный контекст (значения переменных). Устанавливается через pip: pip install better_exceptions. Цель: ускорение ручного анализа ошибок.
import better_exceptions
better_exceptions.hook()
# после этого любой трейсбек станет цветным
x = 10
y = 0
result = x / y # ZeroDivisionError
Как сделать стильный вывод ошибок в консоль с помощью Rich?
Библиотека rich предоставляет класс Traceback для красивой визуализации исключений с синтаксической подсветкой кода. Цель: презентация ошибок в логи или CLI-утилиты.
from rich.traceback import Traceback
try:
1 / 0
except ZeroDivisionError:
traceback_obj = Traceback()
print(traceback_obj)
Как работать с нефатальными уведомлениями?
Модуль warnings позволяет выдавать предупреждения, не прерывая выполнение. Цель: уведомление о потенциальных проблемах (устаревшие функции, возможные ошибки).
import warnings
warnings.warn('Эта функция устарела, используйте новую', DeprecationWarning)
# На экране появится: DeprecationWarning: Эта функция устарела...
Как отловить критические сбои интерпретатора (segfault)?
Модуль faulthandler срабатывает при фатальных ошибках (сигнал SIGSEGV) и выводит стек в stderr. Цель: отладка C-расширений и низкоуровневых проблем.
import faulthandler
faulthandler.enable()
# Далее происходит обращение к неверной памяти через ctypes
Расширенные примеры работы с ошибками в Python
Настройка ротации логов с фильтрацией исключений
Цель: вести логирование ошибок с ограничением размера файлов и разделением по уровню важности. Используется RotatingFileHandler и кастомный фильтр.
import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger('my_app')
logger.setLevel(logging.ERROR)
handler = RotatingFileHandler('errors.log', maxBytes=1024*1024, backupCount=3)
handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
class CriticalOnlyFilter(logging.Filter):
def filter(self, record):
return record.levelno == logging.CRITICAL
handler.addFilter(CriticalOnlyFilter())
logger.addHandler(handler)
try:
raise RuntimeError('Критическая ошибка')
except RuntimeError:
logger.exception('Поймано') # запишется только если уровень CRITICAL
(в файл errors.log будет добавлена запись с уровнем CRITICAL, остальные проигнорируются)
Использование better_exceptions с контекстом (локальные переменные)
Библиотека позволяет видеть значения переменных в момент ошибки. Цель: быстрая локализация бага без дополнительных print.
import better_exceptions
better_exceptions.SUPPORTS_REPR = True # включить представление объектов
better_exceptions.hook()
def divide(a, b):
return a / b
x = 100
y = 0
divide(x, y)
Traceback (most recent call last):
File "test.py", line 9, in <module>
divide(x, y)
│ │ └ 0
│ └ 100
└ <function divide at 0x...>
File "test.py", line 5, in divide
return a / b
│ └ 0
└ 100
ZeroDivisionError: division by zero
Визуализация цепочки исключений через Rich
Rich позволяет отображать вложенные исключения (chained exceptions) с группировкой. Цель: отладка сценариев, где одно исключение порождает другое.
from rich.console import Console
from rich.traceback import Traceback
console = Console(color_system='truecolor')
try:
try:
raise ConnectionError('Сервер недоступен')
except ConnectionError as e:
raise ValueError('Некорректный ответ') from e
except ValueError:
tb = Traceback(show_locals=True, width=100)
console.print(tb)
(выводится цветное дерево с двумя исключениями, локальными переменными)
Подавление исключений с помощью contextlib.suppress
Класс contextlib.suppress из стандартной библиотеки позволяет игнорировать определённые исключения в блоке кода. Цель: чистый код без пустых except.
from contextlib import suppress
with suppress(FileNotFoundError):
with open('not_exist.txt', 'r') as f:
data = f.read()
print('Файл прочитан')
print('Программа продолжается')
Программа продолжается
Интеграция с внешним мониторингом (Sentry)
Библиотека sentry-sdk отправляет исключения на облачный сервер Sentry. Цель: мониторинг production-приложений в реальном времени.
import sentry_sdk
from sentry_sdk import capture_exception
sentry_sdk.init(dsn='https://...@sentry.io/...')
try:
1/0
except ZeroDivisionError as e:
capture_exception(e) # исключение улетит в Sentry