回答:
使用する str
try:
some_method()
except Exception as e:
s = str(e)
また、ほとんどの例外クラスにはargs
属性があります。多くの場合、args[0]
エラーメッセージになります。
pyfuncが推奨するas str
を使用repr
すると、少なくとも例外のクラスが表示されますが、エラーメッセージがない場合は、単に使用すると空の文字列が返されます。私の見解では、出力する場合、それはクラスが何であるかを気にせず、エラーメッセージを必要とするだけのエンドユーザー向けです。
それは本当にあなたが扱っている例外のクラスとそれがどのようにインスタンス化されるかに依存します。特に気になったことはありますか?
e.message
ため、使用したいと思いargs[0]
ます。
raise Exception(u'jörn')
。あなたが実際の例外が、ちょうど見ることはありませんので、失敗は、特に悪いですUnicodeDecodeError
。例外のエンコーディングがわからない場合は(ほとんどの場合はわかりません)、repr(e)
対処するか、本当に必要な場合は、UnicodeDecodeErrorsをキャッチしてフォールバックする例外処理で別のtry-exceptブロックを使用します。repr(e)
。
str
(またはunicode
orか.format
)を数えることができません。エラーメッセージの内容を完全に制御できない場合は、常にを使用repr
して、予期しないUnicodeエラーを回避してください。
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
repr
それは何か他のものと思われる、便利なおかげでunicode
、str
コードし、...の入力に応じて、例外を発生させることがあります。例外を維持しようとする場合にはあまり役に立ちませんが、reprはexception-safe
それが見えるようです
str()
ます。とstr()
私は手に入れ'status'
ながら、repr()
私はKeyError('status')
「ああああ、今はエラーを理解しました」のようでした。
これは古い質問であることはわかってい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)
引用符で囲まれた文字列を返す可能性があります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がそのメカニズムに依存しているなら)。
例えば、でpygraphviz
、e.message
使用して、正しく例外を表示するための唯一の方法であるstr(e)
とのメッセージを包囲しますu''
。
しかし、MySQLdb
では、メッセージを取得する適切な方法はe.args[1]
次のとおりe.message
です。は空で、str(e)
表示されます'(ERR_CODE, "ERR_MSG")'