web-dev-qa-db-ja.com

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これらの場合にプロンプ​​トを出す最後の例外オブジェクト。

47
Ben Hoyt

sysモジュールは、例外の事後調査のためのいくつかの関数を提供します。 sys.last_typesys.last_value 、および sys.last_traceback

sys.last_valueは探しているものです。

59
Cairnarvon

@Cairnarvonが言及したように、_last_value_ memberがsysモジュールであることがわかりませんでした。

sys.exc_info()は私のためにトリックをしました。 sys.exc_info()は、3つの値_(type, value, traceback)_を持つTupleを返します。

したがって、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モジュールのtraceback.format_exc()を使用して、同様の情報を出力できます。

以下は、format_exec()が使用された場合の出力です。

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