Я видел много сообщений о трассировке стека и исключениях в Python. Но не нашел то, что мне нужно.
У меня есть кусок кода Python 2.7, который может вызвать исключение. Я хотел бы поймать его и присвоить строке его полное описание и трассировку стека, которая вызвала ошибку (просто все, что мы используем, чтобы увидеть на консоли). Мне нужна эта строка для печати в текстовое поле в графическом интерфейсе.
Что-то вроде этого:
try:
method_that_can_raise_an_exception(params)
except Exception as e:
print_to_textbox(complete_exception_description(e))
Проблема в том, что это за функция complete_exception_description
?
python
python-2.7
exception-handling
stack-trace
голубоватый
источник
источник
log_error(err)
функцию.Давайте создадим довольно сложную трассировку стека, чтобы продемонстрировать, что мы получаем полную трассировку стека:
Регистрация полной трассировки стека
Лучше всего настроить регистратор для вашего модуля. Он будет знать имя модуля и сможет изменять уровни (среди других атрибутов, таких как обработчики)
И мы можем использовать этот регистратор, чтобы получить ошибку:
Какие журналы:
И поэтому мы получаем тот же вывод, что и при появлении ошибки:
Получение только строки
Если вы действительно хотите получить строку, используйте
traceback.format_exc
вместо нее функцию, демонстрирующую запись строки здесь:Какие журналы:
источник
except Exception as e: logger.exception("<<clearly and distinctly describe what failed here>>", exc_info=e)
exc_info
аргумент ожидает «кортеж исключения», тогда какerror
он является экземпляромException
объекта (или подкласса), и нет необходимости изменятьerror
егоe
.В Python 3 следующий код отформатирует
Exception
объект в точности так, как он будет получен с помощьюtraceback.format_exc()
:Преимущество заключается в том, что
Exception
нужен только объект (благодаря записанному__traceback__
атрибуту), и поэтому его легче передать в качестве аргумента другой функции для дальнейшей обработки.источник
.__traceback__
иtype
, см stackoverflow.com/a/58764987/5717886Вы используете sys.exc_info () для сбора информации и функций в
traceback
модуле для ее форматирования. Вот несколько примеров для его форматирования.Вся строка исключения находится по адресу:
источник
Для тех, кто использует Python-3
Используя
traceback
модуль иexception.__traceback__
можно извлечь трассировку стека следующим образом:traceback.extract_stack()
__traceback__
из объекта исключения с помощьюtraceback.extract_tb()
traceback.format_list()
Простая демонстрация:
Мы получаем следующий вывод при вызове
bar()
:источник
Вы также можете рассмотреть возможность использования встроенного модуля Python, cgitb , для получения действительно хорошей, хорошо отформатированной информации об исключениях, включая значения локальных переменных, контекст исходного кода, параметры функций и т. Д.
Например, для этого кода ...
мы получаем вывод этого исключения ...
источник
Если вы хотите получить ту же информацию, что и при исключении, вы можете сделать что-то вроде этого. Делай
import traceback
и потом:Я использую Python 3.7.
источник
Для Python 3.5+ :
Таким образом, вы можете получить трассировку стека из своего исключения, как и из любого другого исключения. Используйте
traceback.TracebackException
для этого (просто заменитеex
ваше исключение):Расширенный пример и другие возможности для этого:
Вывод будет примерно таким:
источник
мои 2 цента:
источник
Если ваша цель состоит в том, чтобы сообщение об исключении и трассировке стека выглядело точно так же, когда python выдает ошибку, в обоих питонах 2 + 3 работает следующее:
Он работает, удаляя последний
format_stacktrace()
вызов из стека и присоединяя остальные. При запуске приведенный выше пример дает следующий вывод:источник
Я определил следующий вспомогательный класс:
Который я позже смогу использовать так:
И позже может потреблять это так:
(Справочная информация: я был разочарован из-за использования
Promise
s вместе сException
s, который, к сожалению, передает исключения, вызванные в одном месте, обработчику on_rejected в другом месте, и, следовательно, трудно получить трассировку из исходного местоположения)источник