2010-12-12 9 views
19

でPythonの昇給ラインを表示しない、例外スタックは、スタックの最後の項目として昇給ライン自体を示しています。これは明らかにエラーではなく、概念的には正しいですが、コードを外部(モジュールなど)で使用しているときにデバッグには役立たないものに焦点を当てています。は例外スタック

この問題を回避し、Pythonの標準ライブラリのように、最後の一人として、以前から最後のスタック項目を表示するにはPythonを強制する方法はあります。

+7

raise行は、コンパイルされたCコードから呼び出されると非表示になります(表示する行がないため)。標準ライブラリのPythonの部分には、トレースバックにraise文が表示されます。 –

+0

おそらく 'sys.excepthook'をハックして、' raise'の場合は最後の行を除外することができます。しかし、一般的にそれは慣れることはできません。 – delnan

+4

便利な例外を発生させることができます。 –

答えて

7

により警告:インタプリタの動作を変更するには、一般的に眉をひそめるされます。また、エラーが発生した場所を正確に見ることは、デバッグに役立ちます。特に、関数がいくつかの異なる理由でエラーを発生させる可能性がある場合に便利です。

tracebackモジュールを使用して、sys.excepthookをカスタム関数に置き換えた場合は、おそらくこれが可能です。しかし、変更を加えることは、あなたのモジュールだけでなく、プログラム全体のエラー表示にも影響しますので、おそらく推奨されません。

また、エラーを修正し、それを再引き上げ、try/exceptブロック内のコードを置くことで見ることができます。しかし、予期せぬエラーを引き起こす可能性は低いでしょう。

-1

私は、引数を検証するために、例外メカニズムを使用しないようにそれがある限り魅力的なことをお勧めしたいです。例外を条件付きでコーディングすることは、「開発者として、私の提供する引数が引き起こす可能性があるすべての悪い条件を考えないと、アプリをクラッシュさせるようなものです。 、OSやハードウェアまたはPython言語のような何か他の制御の下で複数の論理だろう、私は知りません。あなたがのためのソリューションを要求するようしかし実際には、私は例外を使用しています。

あなたの質問に答えるために、部分的にthuslyコーディングするだけのように簡単です:

class MyObject(object): 
    def saveas(self, filename): 
     if not validate_filename(filename): 
      return False 
     ... 

、発信者

if not myobject.saveas(filename): report_and_retry() 

恐らく大きな答えではなく、ただ考えるべきことです。

+0

私はできるだけ多くの例外を避け、それに対処し、それを踏襲し、問題を記録し、歩行を続けるよう伝えるだけで、これをアップホートしなければなりませんでした。私は他の人のようにどこでも例外をスローするよりもここでデバッグの成功を収めています...基本的に私はraise()の代わりにprint()を使用しています – Tcll

+0

私はちょうどこれの反対側も考えました。ほとんどの人はこれを下降させてしまいます(私は最後のコメントがまだ立っていますが、まだまだ落ち着きません)、ほとんどの良い開発者は、間違った使用事例のたびに例外をスローするのではなく、例外に値する特定のケースだけが...あなたのコードでさえも捕まえられない特定のケースでは、上記のことが起こる可能性があります。例:filenameはstrを表すオブジェクトです。 – Tcll

4

あなたはPythonで独自の例外フックを作成できます。以下は私が使用しているコードの例です。

import sys 
import traceback 

def exceptionHandler(got_exception_type, got_exception, got_traceback): 
    listing = traceback.format_exception(got_exception_type, got_exception, got_traceback) 
    # Removing the listing of statement raise (raise line). 
    del listing[-2] 
    filelist = ["org.python.pydev"] # avoiding the debuger modules. 
    listing = [ item for item in listing if len([f for f in filelist if f in item]) == 0 ] 
    files = [line for line in listing if line.startswith(" File")] 
    if len(files) == 1: 
     # only one file, remove the header. 
     del listing[0] 
    print>>sys.stderr, "".join(listing) 

以下は、私のカスタム例外コードで使用している行です。方法例外で

sys.excepthook = exceptionHandler 
raise Exception("My Custom error message.") 

あなたが不要なファイルを無視したい場合は、リスト内の「ファイル名を」ファイル名またはモジュール名を追加することができます。 Python pydevモジュールは無視されています。なぜなら、Eclipseでpydevデバッガを使用しているからです。

上記は私のモジュールで特定の目的のために使用されています。モジュールに対して変更して使用することができます。

関連する問題