web-dev-qa-db-ja.com

Python 3で例外を印刷する方法は?

今、except Exception:節で例外をキャッチし、print(exception)を実行します。結果は常に<class 'Exception'>を出力するため、情報を提供しません。これはpython 2で機能することを知っていましたが、python3ではどのようにすればよいですか?

37
Haonan Chen

Exceptionを変数に割り当てる必要があると思います。 Python 3チュートリアルに表示

def fails():
    x = 1 / 0

try:
    fails()
except Exception as ex:
    print(ex)

簡単に説明すると、asは、特定の複合ステートメントで使用される擬似割り当てキーワードであり、先行ステートメントを変数に割り当てたり、別名を付けたりします。

この場合、asは、キャッチされた例外を変数に割り当て、すぐに処理する必要なく、例外に関する情報を保存して後で使用できるようにします。 (これは Python 3言語リファレンス:tryステートメント で詳しく説明されています。)


asを使用する他の複合ステートメントは、withステートメントです。

@contextmanager
def opening(filename):
    f = open(filename)
    try:
        yield f
    finally:
        f.close()

with opening(filename) as f:
    # ...read data from f...

ここでは、withステートメントを使用して、 context managers で定義されたメソッドでブロックの実行をラップしています。これは、きちんとしたジェネレーターパッケージの拡張try...except...finallyステートメントと同様に機能し、asステートメントは、ジェネレーターが生成した結果をコンテキストマネージャーから拡張使用のために変数に割り当てます。 (これは Python 3言語リファレンス:withステートメント で詳しく説明されています。)


最後に、モジュールをインポートするときにasを使用して、モジュールを別の(通常は短い)名前にエイリアスすることができます。

import foo.bar.baz as fbb

これについては Python 3言語リファレンス:importステートメント で詳しく説明されています。

69
Noah Bogart

python 2以降の変更点は次のとおりです。

    try:
        1 / 0
    except Exception as e: # (as opposed to except Exception, e:)
                           # ^ that will just look for two classes, Exception and e
        # for the repr
        print(repr(e))
        # for just the message, or str(e), since print calls str under the hood
        print(e)
        # the arguments that the exception has been called with. 
        # the first one is usually the message. (OSError is different, though)
        print(e.args)

あなたは標準的なライブラリモジュールを見ることができます traceback より手の込んだものについて。

24
rigel

試して

except Exception as e:
    print(e)
9
wpercy