Pythonで例外値を取得する


239

そのコードがある場合:

try:
    some_method()
except Exception, e:

この例外値(つまり、文字列表現)を取得するにはどうすればよいですか?

回答:


323

使用する str

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

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

pyfuncが推奨するas strを使用reprすると、少なくとも例外のクラスが表示されますが、エラーメッセージがない場合は、単に使用すると空の文字列が返されます。私の見解では、出力する場合、それはクラスが何であるかを気にせず、エラーメッセージを必要とするだけのエンドユーザー向けです。

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


私はこれを印刷してレポートを作成しています。str(e)は問題ないと思います。
どうも

8
実際にはメッセージではない可能性があるe.messageため、使用したいと思いargs[0]ます。
cedbeu 2013年

3
repr(e)は、「グローバル名 'variable'が定義されていません」ではなく、完全な例外を取得する場合にも役立ちます(例:NameError( "global name 'variable' is not defined")
Ben Morris

49
この回答は危険です。Unicode例外では次のように失敗しますraise Exception(u'jörn')。あなたが実際の例外が、ちょうど見ることはありませんので、失敗は、特に悪いですUnicodeDecodeError。例外のエンコーディングがわからない場合は(ほとんどの場合はわかりません)、repr(e)対処するか、本当に必要な場合は、UnicodeDecodeErrorsをキャッチしてフォールバックする例外処理で別のtry-exceptブロックを使用します。repr(e)
ジョーンHEES

11
@JörnHeesに同意します。Unicodeの処理が原因でバグが発生した回数str(またはunicodeorか.format)を数えることができません。エラーメッセージの内容を完全に制御できない場合は、常にを使用reprして、予期しないUnicodeエラーを回避してください。
ケニートライテック2015

185

repr()の使用とreprとstrの使用の違い

使用repr

>>> try:
...     print(x)
... except Exception as e:
...     print(repr(e))
... 
NameError("name 'x' is not defined")

使用str

>>> try:
...     print(x)
... except Exception as e:
...     print(str(e))
... 
name 'x' is not defined

2
ああ、reprそれは何か他のものと思われる、便利なおかげでunicodestrコードし、...の入力に応じて、例外を発生させることがあります。例外を維持しようとする場合にはあまり役に立ちませんが、reprはexception-safeそれが見えるようです
ダッシュ1995

2
これには、実際には例外のタイプが含まれているため、どのようなソリューションよりもはるかに優れていstr()ます。とstr()私は手に入れ'status'ながら、repr()私はKeyError('status')「ああああ、今はエラーを理解しました」のようでした。
jlh 2017

27

これは古い質問であることはわかっていtracebackますが、モジュールを使用して例外の出力を処理することをお勧めします。

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


23

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

try:
    1/0
except Exception, e:
    print e.message

出力:

integer division or modulo by zero

args[0] 実際にはメッセージではないかもしれません。

str(e)引用符で囲まれた文字列を返す可能性がありますu

'integer division or modulo by zero'

repr(e) おそらくあなたが望むものではない完全な例外表現を与えます:

"ZeroDivisionError('integer division or modulo by zero',)"

編集する

私の悪い!!! BaseException.message から廃止さ2.6れたようです、最後に、例外メッセージを表示する標準化された方法がまだないようです。だから私はあなたのニーズに応じてe.argsそれにstr(e)応じて対処するのが最善だと思います(そしておそらくe.messageあなたが使用しているlibがそのメカニズムに依存しているなら)。

例えば、でpygraphvize.message使用して、正しく例外を表示するための唯一の方法であるstr(e)とのメッセージを包囲しますu''

しかし、MySQLdbでは、メッセージを取得する適切な方法はe.args[1]次のとおりe.messageです。は空で、str(e)表示されます'(ERR_CODE, "ERR_MSG")'


0

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


0

エラーの種類/原因がわからない場合は、次のことを試してください。

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

ただし、注意してください。pep8警告が表示されます。

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

0

エラーメッセージを調べて、何かを行うには(Python 3を使用)...

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.