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
モジュールは、例外の事後調査のためのいくつかの関数を提供します。 sys.last_type
、 sys.last_value
、および sys.last_traceback
。
sys.last_value
は探しているものです。
@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
_