TGViewer
PYTHON IN DEPTH🐍 PYTHON IN DEPTH🐍 @python_in_depth · 386 subscribers
Post #40 822
Исключения
Представьте, вы приступаете к работе над новым проектом и обнаруживаете в логах следующие сообщения, которые смешаны с успешными запросами к серверу:

Unexpected exception:

Что-то постоянно ломается, но без каких-либо сообщений.

Если сократить проблему до минимального примера из кода приложения, с которым я недавно столкнулся, получится следующая конструкция, которая на первый взгляд не вызывает подозрений:

try:
raise KeyError
except Exception as e:
print(f"Unexpected exception: {e}")

При выполнении этого примера получим следующий результат:

Unexpected exception:

Проблема заключается в том, что есть четыре способа вывести сообщение об исключении:

🐟 print(e)
🐟 print(str(e))
🐟 print(e.message)
🐟 print(repr(e))

Первые два варианта не особенно информативны. Например, если мы попытаемся обратиться к несуществующему ключу в словаре (самая распространенная ошибка в Python), то эти варианты выведут только название ключа.

my_dict = {}
try:
b = my_dict["bad"]
except Exception as e:
print(f"Unexpected exception: {e}")

Unexpected exception: 'bad'

Это происходит потому, что str(e) и e выводят только сообщение об ошибке, но не ее тип. Чаще всего этого достаточно, но исключения существуют для того, чтобы информировать о ситуациях, которые не были ожидаемы.

Иногда люди используют print(e.message). Однако здесь возникают две проблемы: во-первых, мы все равно получаем только сообщение об ошибке, а не ее тип. Во-вторых, атрибут message не определен для всех исключений. Если мы не проверим наличие этого атрибута перед использованием, мы получим новое исключение:

AttributeError: 'KeyError' object has no attribute 'message'

Однако магический метод repr, который используется для предоставления наиболее точного описания, справляется с задачей. Рассмотрим сравнение:

try:
raise KeyError
except Exception as e:
print(f"Unexpected exception: {repr(e)}")

Unexpected exception: KeyError()

В случае с использованием словаря получим:

Unexpected exception: KeyError('bad')

что является более явным, чем все три предыдущих варианта
  • ❤ 2
  • 🔥 2
More from @python_in_depth
  1. Feb 20, 2026«Пузырь лопнул», «айти всё», «рынок умер» — каждый раз читаем это с новым интересом. Но да…
  2. Feb 18, 2026«Какой навык самый важный для разработчика?» Ответ неожиданно простой — умение учиться быс…
  3. Feb 9, 2026Как на самом деле работает отбор резюме в 2026 году Современный найм — это не «человек чит…
  4. Feb 2, 2026Ваш backend слишком сложный. Скорее всего — без причины. У большинства команд сложность ра…
  5. Jan 29, 2026Интеграции с внешними системами: как не превратить backend в зоопарк адаптеров Рано или по…
  6. Jan 29, 2025Еееееее, а че мы над js смеемся
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →