2016-10-27 7 views
0

私はJavaでプログラミングをしていましたが、コードがうまくいかないときに生成されるスタックトレースがかなり好きになっていましたが、Pythonで生成されたトレースが少し不足していると感じました。 Pythonのトレースは、次のようになります。一方でどのようにPythonでスタックトレースのようなJavaを生成するには?

java.lang.RuntimeException 
    at test.package.Example.c(Example.java:20) 
    at test.package.Example.b(Example.java:15) 
    at test.package.Example.a(Example.java:10) 

を::

Traceback (most recent call last): 
    File "example.py", line 10, in <module> 
    a() 
    File "example.py", line 2, in a 
    b() 
    File "example.py", line 5, in b 
    c() 
    File "example.py", line 8, in c 
    raise Exception 
Exception 

これらのトレースの両方が、基本的に同じ情報を伝えながら、私は個人的にことを見つけるたとえば、Javaでのトレースは次のようになります。 Javaからのトレースは追跡が容易です。

Pythonがスタックトレースを印刷するための形式を変更する方法はありますか、それとも私のプログラムのルートにカスタム例外ハンドラを作成する必要がありますか?

+0

具体的には、Python形式について特に気に入らない(変更したい)のですか? Pythonのフォーマットは、コードの違反行の実際の内容を表示しているので、Javaのフォーマットよりも多くの*情報を与えるように見えます。 – BrenBarn

+0

@BrenBarn私には必要以上の情報が与えられているような気がします。私が大きなプログラムを書いているときには、スタックトレースに15個以上のエントリがあり、15個の余分な行があると、問題がどこにあるのかを正確に把握するのがずっと難しくなります。私は、常にそのコードを開いて自分自身で見ることができるので、行番号を持つだけで十分だと思います。文脈を奪われた1行のコードを持つことは、非常に有用ではありません。 –

答えて

1

Pythonはそのスタックトレースをフォーマットするために使用する形式を変更するための手段がありますを使用して、それはあなたの代わりに独自のフォーマッタを書くということです。内蔵フォーマットは1つしかありません。

自分自身の機能をsys.excepthookに割り当てることができます。これはトップレベルの例外ハンドラとして機能し、キャッチされなくなった例外にアクセスしてプログラムを終了させます。そこでトレースバックオブジェクトを使用して、好きなように書式を設定することができます。トリプティックの回答は、tracebackモジュールを使用して各スタックフレームの情報を取得する方法を示しています。 extract_tbは違反行のファイル名、行番号、関数、ソーステキストの4組を返すので、ソーステキストを表示しない場合は、それを投げ捨てて残りを連結することができます。しかし、あなたが見たいと思っている出力を構築する作業をしなくてはなりません。

3

tracebackモジュール

import traceback 
try: 
    x= 1/0 
except Exception as e: 
    print(e) 
    traceback.print_exc() 
関連する問題