web-dev-qa-db-ja.com

Pythonで例外値を取得する

私がそのコードを持っているならば:

try:
    some_method()
except Exception,e:

どうすればこのException値(つまり文字列表現)を取得できますか?

ありがとう

201
Frias

strを使用

try:
    some_method()
except Exception as e:
    s = str(e)

また、ほとんどの例外クラスはargs属性を持ちます。多くの場合、args[0]はエラーメッセージになります。

strを使用するとエラーメッセージが表示されない場合は空の文字列が返されますが、pyfuncが推奨するreprを使用すると少なくとも例外のクラスが表示されます。私が考えているのは、印刷しているのであれば、それはクラスが何であるかを気にせず、単にエラーメッセージを望んでいるエンドユーザー向けです。

それは本当にあなたが扱っている例外のクラスとそれがどのようにインスタンス化されるかに依存します。特に何か念頭に置いていましたか。

271
aaronasterling

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
>>> 
>>> 
154
pyfunc

これは昔からの問題であることに気付いたとしても、例外の出力を処理するために tracebackモジュール を使うことをお勧めします。

traceback.print_exc()を使って現在の例外を標準エラーに出力します。それが捉えられないままであれば出力されるのと同じです。traceback.format_exc()では文字列と同じ出力が得られます。出力を制限したい場合や、印刷をファイルのようなオブジェクトにリダイレクトしたい場合は、これらの関数のいずれかにさまざまな引数を渡すことができます。

23
Blckknght

別の方法はまだ与えられていません:

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.message2.6から非推奨になりました 、最後に、例外メッセージを表示するための標準化された方法がまだないようです。ですから、あなたのニーズに応じてe.argsstr(e)を扱うことが最善だと思います(そしてあなたが使っているlibがそのメカニズムに依存しているならばe.message)。

たとえば、pygraphvizでは、e.messageが例外を正しく表示する唯一の方法で、str(e)を使用するとメッセージがu''で囲まれます。

しかしMySQLdbでは、メッセージを取得するための正しい方法はe.args[1]です。e.messageは空で、str(e)'(ERR_CODE, "ERR_MSG")'を表示します。

23
cedbeu

Python2の場合、例外メッセージを取得するにはe.messageを使用することをお勧めします。これは可能性のあるUnicodeDecodeErrorを回避するためです。しかし、OSErrorのようなある種の例外ではe.messageは空になります。その場合、エラーを見逃さないようにexc_info=Trueをログ記録関数に追加することができます。
python3の場合、私はstr(e)を使うのが安全だと思います。

0
apporc

エラーの種類や原因が分からない場合は、次の方法を試してください。

import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

しかし、注意してください、あなたはpep8の警告を受けるでしょう:

[W] PEP 8 (E722): do not use bare except
0
Kostanos