61

インタラクティブプロンプト(REPL)でPythonコードをデバッグするとき、例外を発生させるコードを作成することがよくありますが、それを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プロンプトでの最後の例外オブジェクト。

4

2 に答える 2

78

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

sys.last_valueあなたが探しているものです。

于 2013-03-25T01:06:42.373 に答える
30

last_value@Cairnarvonが述べたように、 sysモジュールのメンバーは見つかりませんでした。

sys.exc_info()私のためにトリックをしました。sys.exc_info()3つの値を持つタプルを返します(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()fromtracebackモジュールを使用して同様の情報を印刷することもできます。

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

Traceback (most recent call last):
  File "python", line 6, in <module>
IndexError: list assignment index out of range
于 2017-01-16T05:50:24.253 に答える