2012-08-31 8 views
7

私は、特定の例外の型をキャッチ、それは実際に私がキャッチしたい例外だかどうかを確認するために、例外のメッセージを検査して、そうでない場合は、例外を調達再てるような状況を持っている:Pythonでは、元の呼び出しスタックを維持しながら例外を調べて再起動するにはどうすればよいですか?

try: 
    # do something exception-prone 
except FooException as e: 
    if e.message == 'Something I want to handle': 
     # handle the exception 
    else: 
     raise e 

これは正常に動作し、1つの問題があります。例外が再発生した場合、その例外は元々発生した場所ではなく、再発生した行(つまりraise e)で発生します。元の例外がどこで発生したのかを知りたいデバッグには理想的ではありません。

私の質問:オリジナルの例外の場所を維持しながらキャッチした後で例外を再発生させるか、「渡す」方法はありますか?

注:実際の状況が不思議に思う場合は、__import__を使用していくつかのモジュールを動的にインポートしています。私はImportErrorを捕まえて、これらのモジュールが存在しない場合を適切に処理します。しかし、これらのモジュール自体にImportErrorを呼び出すimportステートメントが含まれている場合は、(アプリケーションの観点から)例外が発生しないように、そして元の場所でデバッグまでツールが関係している。

答えて

7

ちょうど行います

raise 

の代わりraise eraising exceptionsのチュートリアルのセクションを参照してください、ともlanguage reference on raise statements

何の表現が存在しない場合は、現在のスコープでアクティブであった最後の例外を再発生させ上げます。現在のスコープで例外がアクティブでない場合、これがエラーであることを示すTypeError例外が発生します(IDLEで実行されている場合は、代わりにQueue.Empty例外が発生します)。

+0

Duh!簡単です。私はtry/exceptのための参照を見ていて、raiseを見るのを忘れていました。ありがとう。 – Ghopper21

関連する問題