← Все вопросы

Как из except Exception as e напечатать сам текст ошибки и её тип?

Задан 3 месяца назад550 просмотров3 ответа
13

Ловлю исключение, но в логе у меня просто «Ошибка». Как внутри except Exception as e достать читаемое сообщение, тип ошибки и при желании полный traceback?

3 ответа

25

Объект исключения e уже содержит всё нужное:

try:
    int("abc")
except Exception as e:
    print(e)                  # invalid literal for int() with base 10: 'abc'
    print(type(e).__name__)   # ValueError  — имя типа
    print(repr(e))            # ValueError("invalid literal ...")  — тип + текст
  • str(e) / print(e) — человекочитаемое сообщение.
  • type(e).__name__ — короткое имя класса ошибки.
  • repr(e) — и тип, и сообщение сразу, удобно для логов.

Если нужен ПОЛНЫЙ traceback (как при падении), не теряя его в строке лога:

import traceback
try:
    ...
except Exception as e:
    traceback.print_exc()              # печатает весь стек
    # или в строку: text = traceback.format_exc()

А если используете модуль logging, то logging.exception("упало") внутри except сам подложит traceback.

Александр Комаров logging.exception внутри except — золотой стандарт, не теряешь стек. · 3 месяца назад
9

print(e) — это и есть текст ошибки. Тип — type(e).__name__.

5

Для полного стека — import traceback; traceback.print_exc().

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект