2017-09-07 5 views
0

Javaでは、例外のメッセージを取得することは、常に特定のメソッドを呼び出すことと同じくらい簡単です。 しかし、Pythonでは不可能と思われます。時にはこれを行うことによって動作します:私はいつもPythonで安全な方法で例外のメッセージを受け取るようにしますか?

しかし、そのような例外をキャプチャすると、メッセージ属性が存在しないために別の例外が発生することがあります。皮肉なことに悲しい。

print(e.msg) 

しかし、時には、それはまた、不足している属性の例外が発生します:エラーを制御しようとすると、時にはそれがこれを行うことで動作し、別の1 ...

を生成します。

時には、これも同様に動作します:

print(str(e)) 

しかし、それは単に無駄ですので、時にはそれは、空の文字列を出力します。

私は、使用しているライブラリ、具体的なException実装に依存していると聞いています。それは私にとっては本当に馬鹿だ。どのような属性がエラーメッセージを取得するために持っているのかわからない場合に起こったことを印刷するためにエラーを処理する方法はありますか?

+1

Iを使用することができます。

一般的に、あなたは明確なことやオーバーライドされない場合は、例外のタイプに関する情報を少なくとも含んでいることになっているreprを使用することができます1つの解決策がジェネリックスーパークラスではなく特定の例外をキャッチするとします。 –

+1

ジェームズが提案するように、それぞれの特定の例外タイプをキャッチし、それぞれを適切に処理します。 –

+1

'traceback'モジュールを参照してください。あなたの目標が "私はまったく得られない"エラーを記録することであるなら、トレースバックは "操作が失敗しました"と言うランダムな文字列よりも100倍便利です(もしかすると空文字列モジュール作成者がメッセージを追加できませんでした)。受け取ることを期待しているエラーであれば、他の人が言ったように、基本クラスの「例外」ではなく、その特定の例外をキャッチする必要があります。 –

答えて

2

しかし、時には空の文字列が表示されるため、単に役に立たないだけです。

誰かがメッセージなしで例外を発した場合は、そうです。そのために(あなたが使っているライブラリの)著者を非難してください。あなたが全体のトレースバックが必要な場合

try: 
    0/0 
except Exception as exc: 
    print(repr(exc)) 
    raise 

あなたは

import traceback 
try: 
    0/0 
except Exception: 
    print(traceback.format_exc()) 
    raise 
関連する問題