2013-03-25 2 views
31

対話プロンプト(REPL)でPythonのコードをデバッグする場合、多くの場合、私は例外を発生させ、いくつかのコードを記述しますが、私はtry/exceptでそれをラップしていないので、エラーが発生したら、私は永遠にしました例外オブジェクトを失った。Pythonプロンプトでエラーが発生した後に最後の例外オブジェクトを取得するには?

多くの場合、Pythonが出力するトレースバックとエラーメッセージが十分ではありません。たとえば、URLを取得する場合、サーバーは40倍のエラーを返し、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 

Drat、応答の本体は何といっていますか?それはおそらく、私はそれを除いてのtry /に包まれた再実行してコードに通常は簡単です実現するが、それは理想的ではないのです...それに

を貴重なエラー情報を持っていました。私は、この特定のケースでは、requestsライブラリ(HTTPエラーを発生させない)を使用していた場合、この問題は発生しないと考えています...しかし、もっと一般的な方法があるかどうかは本当に不思議ですこれらのケースでは、Pythonプロンプトの最後の例外オブジェクトです。

答えて

44

sysモジュールは、例外の事後検査にいくつかの機能を提供します:sys.last_type,sys.last_value、およびsys.last_tracebackです。

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

+1

非常に素晴らしい、ありがとうございました!文書化されているとおりに動作します。私のGoogleの検索ではそれを見つけられなかったというのは奇妙ですが、まあまあです。 (かなり味付けされたPython開発者であるにもかかわらず、Pythonまたはその標準ライブラリについて毎日何かを学んでいます...) –

+0

@BenHoyt FYIは、 'sys'のドキュメンテーションに従って、"これらの3つは、トレースバックが印刷されました。 " – satoru

+1

@satoruまあ、明らかに。通常のプログラムでは、未処理の例外がプログラムを終了します。 – Cairnarvon

4

@Cairnarvonが述べたように、私はどのlast_valueメンバーが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モジュールからtraceback.format_exc()は、同様の情報を印刷するために使用することができ、一例です。以下fortmat_exec()が使用される場合に出力され

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

関連する問題