Подтвердить что ты не робот

Как получить последний объект исключения после возникновения ошибки в приглашении Python?

При отладке кода Python в интерактивном приглашении (REPL) часто я напишу какой-то код, который вызывает исключение, но я не завернул его в try/except, поэтому, как только возникает ошибка, Я навсегда потерял объект исключения.

Часто выводится сообщение о трассировке и ошибке Python. Например, при получении URL-адреса сервер может вернуть ошибку 40x, и вам потребуется содержимое ответа через error.read()... но у вас больше нет объекта ошибки. Например:

>>> import urllib2
>>> f = urllib2.urlopen('http://example.com/api/?foo=bad-query-string')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  ...
urllib2.HTTPError: HTTP Error 400: Bad Request

Что, ответила тело ответа? Вероятно, в нем была важная информация об ошибках...

Я понимаю, что обычно легко перезапустить код, завернутый в try/except, но это не идеально. Я также понимаю, что в этом конкретном случае, если бы я использовал библиотеку requests (которая не вызывает ошибки HTTP), у меня не было бы этой проблемы... но мне действительно интересно, существует ли более общий способ для получения последнего объекта исключения в приглашении Python в этих случаях.

4b9b3361

Ответ 1

Модуль sys предоставляет некоторые функции для пост-hoc рассмотрения исключений: sys.last_type, sys.last_value и sys.last_traceback.

sys.last_value - это тот, который вы ищете.

Ответ 2

Как упоминал @Cairnarvon, я не обнаружил, что какой-либо член last_value является sys-модулем.

sys.exc_info() помогло. sys.exc_info() возвращает кортеж с тремя значениями (type, value, traceback).

Итак, sys.exc_info()[1] даст читаемую ошибку. Вот пример,

import sys
list = [1,2,3,4]
try:
    del list[8]
except Exception:
    print(sys.exc_info()[1])

выводит list assignment index out of range

Кроме того, для распечатки подобной информации можно использовать модуль traceback.format_exc() из traceback.

Ниже приведен вывод, если используется fortmat_exec(),

Traceback (most recent call last): File "python", line 6, in <module> IndexError: list assignment index out of range