Ответ 1
Модуль sys
предоставляет некоторые функции для пост-hoc рассмотрения исключений: sys.last_type
, sys.last_value
и sys.last_traceback
.
sys.last_value
- это тот, который вы ищете.
При отладке кода 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 в этих случаях.
Модуль sys
предоставляет некоторые функции для пост-hoc рассмотрения исключений: sys.last_type
, sys.last_value
и sys.last_traceback
.
sys.last_value
- это тот, который вы ищете.
Как упоминал @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