4

これは、黙認の奇跡の後、インタープリターが次のスニペットを許可したときに、複数の例外をキャッチすることで見つけることができる最も近い答えです (正しい方法):

try:
    x = "5" + 3
except NameError and TypeError as e:
    print e

ドキュメントはこのスニペットも提供しますが、前者のようなものはありません:

... except (RuntimeError, TypeError, NameError):
...     pass

ですから、セカンドオピニオンがあればいいのですが、私の質問は次のようになります。

  • メッセージを印刷するだけでなく、印刷ステートメントの先頭に発生したエラーの正確なタイプを挿入するにはどうすればよいですか。たとえば、最初のスニペットが代わりにこれを出力して応答することをお勧めします。TypeError: cannot concatenate 'str' and 'int' objects

argsインタープリターがリストのみをmessageメンバーとしてリストすることを考えると、おそらく不可能または簡単ではないように感じますNameErrorが、おそらくそれは単に不完全です.

私はこれを自分で試しましたが、エラーを除外しなくなりました (isinstance を誤解している可能性があります):

try:
    x = "5" + 3
except (NameError, TypeError) as e:
    if isinstance(e, NameError):
        print "NameError: " + e
    elif isinstance(e, TypeError):
        print "TypeError: " + e
    else:
        print e
4

4 に答える 4

9

エラーを個別にキャッチできます。その他の例については、次のリンクを参照してください: http://docs.python.org/2/tutorial/errors.html#handling-exceptions

次のようなもの:

try:
    x = "5" + 3
except TypeError as e:
    print "This is a TypeError"
    print e
except NameError as e:
    print "This is a NameError"
    print e
于 2013-09-26T03:53:54.393 に答える
2

minitech は、あなたがやりたいことを実行するための最善の方法を既に示しているので ( print type(e).__name__)、あなたが間違ったことをカバーします。

の場合e = NameError("BAD, BAD, BAD!")print eが得られBAD, BAD, BAD!ます。

ただし、は文字列ではない"My string" + eため有効でeはありません。print "My string", eprint "My string" + str(e)またはprint "My string{}".format(e)代わりに使用します。

于 2013-09-26T03:55:18.970 に答える
1

あなたの問題は、このような例外で文字列を連結しようとしていることです

>>> 'foo' + TypeError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'type' objects

最も簡単な回避策:

>>> 'foo' + str(TypeError)
"foo<type 'exceptions.TypeError'>"
>>> 
于 2013-09-26T03:53:52.770 に答える