Pythonのexceptionをprint()して何も出ない原因


このエントリーをはてなブックマークに追加

Python 3にて以下のように例外オブジェクトをprint()するコード

try:
    raise ValueError
except Exception as e:
    print(e)

を実行しても、以下のように何も出力されません。




結論からいうと、上記のコードを以下のように修正すると

try:
    raise ValueError('value error has occured')
except Exception as e:
    print(e)

以下の様に出力されるようになります。

value error has occured

これはなぜかを説明していきます。

Pythonのraise文で投げることができるのは、例外クラスか、例外インスタンスのどちらかです( 参考 )。先程の例外クラスを投げた例

    raise ValueError

は、以下

    raise ValueError()

のように、引数無しで生成した例外インスタンスを投げたのと同じになります。

例外インスタンスをつくるときの引数には何を与えればよいでしょうか? 参考

raise Exception('spam', 'eggs')

という例がある通り、引数には任意のオブジェクトを任意の個数与えることができるようです。ただ、普通は、例外が起こった原因を究明するために役立つ情報を文字列で与えることが多いと思います。

ここで設定したオブジェクトは、except節で'as'を使って指定した変数の.argsの中に入っています。また、この変数を文字列として扱うと、.args を参照しなくても引数を直接印字できるようになっています。よって、下の例ではprint(e.args)としてもprint(e)としても同じ結果になります。

try:
    raise ValueError('spam', 'eggs')
except Exception as e:
    print(e.args)  # ('spam', 'eggs') と表示される
    print(e)  # ('spam', 'eggs') と表示される

ここまでの説明により、

try:
    raise ValueError
except Exception as e:
    print(e)

で何も表示されなかった理由がわかりました。