私がそのコードを持っているならば:
try:
some_method()
except Exception,e:
どうすればこのException値(つまり文字列表現)を取得できますか?
ありがとう
str
を使用
try:
some_method()
except Exception as e:
s = str(e)
また、ほとんどの例外クラスはargs
属性を持ちます。多くの場合、args[0]
はエラーメッセージになります。
str
を使用するとエラーメッセージが表示されない場合は空の文字列が返されますが、pyfuncが推奨するrepr
を使用すると少なくとも例外のクラスが表示されます。私が考えているのは、印刷しているのであれば、それはクラスが何であるかを気にせず、単にエラーメッセージを望んでいるエンドユーザー向けです。
それは本当にあなたが扱っている例外のクラスとそれがどのようにインスタンス化されるかに依存します。特に何か念頭に置いていましたか。
Repr()とreprとstrの使用の違い
Reprを使う:
>>> try:
... print x
... except Exception, e:
... print repr(e)
...
NameError("name 'x' is not defined",)
>>>
Strを使う:
>>>
>>> try:
... print x
... except Exception, e:
... print str(e)
...
name 'x' is not defined
>>>
>>>
これは昔からの問題であることに気付いたとしても、例外の出力を処理するために traceback
モジュール を使うことをお勧めします。
traceback.print_exc()
を使って現在の例外を標準エラーに出力します。それが捉えられないままであれば出力されるのと同じです。traceback.format_exc()
では文字列と同じ出力が得られます。出力を制限したい場合や、印刷をファイルのようなオブジェクトにリダイレクトしたい場合は、これらの関数のいずれかにさまざまな引数を渡すことができます。
別の方法はまだ与えられていません:
try:
1/0
except Exception, e:
print e.message
出力:
integer division or modulo by zero
args[0]
は実際にはメッセージではないかもしれません。
str(e)
は、周囲の引用符で文字列を返し、unicodeの場合は先頭にu
を付けて返します。
'integer division or modulo by zero'
repr(e)
は、おそらくあなたが望むものではない完全な例外表現を与えます:
"ZeroDivisionError('integer division or modulo by zero',)"
編集
私の悪い! BaseException.message
2.6
から非推奨になりました 、最後に、例外メッセージを表示するための標準化された方法がまだないようです。ですから、あなたのニーズに応じてe.args
とstr(e)
を扱うことが最善だと思います(そしてあなたが使っているlibがそのメカニズムに依存しているならばe.message
)。
たとえば、pygraphviz
では、e.message
が例外を正しく表示する唯一の方法で、str(e)
を使用するとメッセージがu''
で囲まれます。
しかしMySQLdb
では、メッセージを取得するための正しい方法はe.args[1]
です。e.message
は空で、str(e)
は'(ERR_CODE, "ERR_MSG")'
を表示します。
Python2の場合、例外メッセージを取得するにはe.message
を使用することをお勧めします。これは可能性のあるUnicodeDecodeError
を回避するためです。しかし、OSError
のようなある種の例外ではe.message
は空になります。その場合、エラーを見逃さないようにexc_info=True
をログ記録関数に追加することができます。
python3の場合、私はstr(e)
を使うのが安全だと思います。
エラーの種類や原因が分からない場合は、次の方法を試してください。
import sys
try:
doSomethingWrongHere()
except:
print('Error: {}'.format(sys.exc_info()[0]))
しかし、注意してください、あなたはpep8の警告を受けるでしょう:
[W] PEP 8 (E722): do not use bare except