6982

[code]

    try:
        hoge()
    except:
        fuga()
    
[/code]

すべての例外をキャッチするために上のように書いたのですが、その例外の詳細を出力させるにはどうしたらよいですか？


CC BY-SA 3.0
2015-02-23T12:25:44.447
6972
2016-04-11T05:59:26.813
8355
question
python
pythonですべての例外をキャッチし、詳細を表示させたい。


sysモジュールの[`exc_info()`](http://docs.python.jp/3.4/library/sys.html#sys.exc_info)で現在処理中の例外を参照できます。

[code]

    try:
        hoge()
    except:
        print(sys.exc_info())
    
[/code]


CC BY-SA 3.0
2015-02-23T12:35:46.760
6974
2015-02-23T12:35:46.760
49
6972
answer


`traceback`モジュールの`print_exc()`を使えば、スタック情報も表示します。

[code]

    def f1(a, b):
        return f2(a) + f2(b)
    
    def f2(x):
        return 1.0 / x
    
    
    try:
        f1(1.0, 0.0)
    except:
        import traceback
        traceback.print_exc()
    
[/code]

出力は:

[code]

    Traceback (most recent call last):
      File "C:\Miniconda\Scripts\test_traceback.py", line 9, in <module>
        f1(1.0, 0.0)
      File "C:\Miniconda\Scripts\test_traceback.py", line 2, in f1
        return f2(a) + f2(b)
      File "C:\Miniconda\Scripts\test_traceback.py", line 5, in f2
        return 1.0 / x
    ZeroDivisionError: float division by zero
    
[/code]


CC BY-SA 3.0
2015-02-23T21:38:45.233
6982
2015-02-23T21:38:45.233
8488
6972
answer


`traceback`の情報じゃなくて、ただ、メッセージが知りたいなら、Exceptionの`args`が使えます（tupleが返される)：

[code]

    def hoge():
        return 1.0/0   
    
    try:
        hoge()
    except Exception as e:
        print("例外args:", e.args)
        fuga()
    
[/code]

ただし、pythonでは、詳細なExceptionを指定しないことは、勧められていないですね。

> Errors should never pass silently. エラーが起こっているのにそれがわからないなんてのは×
>
> Unless explicitly silenced. 「そのエラーは通知しなくてもいいよ」と明示的に指定されたのなら話は別だけど

<http://www.lifewithpython.com/2013/01/pep-20-the-zen-of-python.html>

できれば、期待している例外を指定するといいです。

上記のものの代わりに下記のものの方がいいでしょう：

[code]

    try:
        hoge()
    except ZeroDivisionError as e:
        print("例外args:", e.args)
        fuga()
    
[/code]


CC BY-SA 3.0
2015-02-24T05:42:43.187
7008
2016-04-11T05:59:26.813
2016-04-11T05:59:26.813
2314
2314
6972
answer