2016-07-06 7 views
1

sys.exc_info()はタプル(型、値、トレースバック)を返します。
ですので、sys.exc_info()[2]がトレースバックオブジェクトです。なぜexc_tracebackが返されないのですか?

なぜそれがこのコードで例外のトレースバックをキャッチしません:

import sys 

try: 
    1/0 
except ZeroDivisionError: 
    print sys.exc_info()[2].tb_frame.f_back 

tb_frameとf_back使い方はここで説明されています: Frame Objects

+1

トレースバックがあります。そうでなければ、 'AttributeError'が返されますが、トレースバックのフレームには' f_back'がありません。それは私には完全に賢明です。これを直接実行しているなら、あなたはどんな外部フレームを期待していましたか?* – jonrsharpe

+0

269行のtraceback.pyモジュールで標準ライブラリに同じ:tb_frame.f_backが使用されました。 – Heartagramir

+0

それは本当に私の質問に答えるものではありません。 *なぜ、外枠*があると思いましたか? – jonrsharpe

答えて

2

何の外枠がないので、あなたがNoneを参照してください。これを直接実行しているので、現在のフレームが最後のフレームです。これを実証するために、私はdemo.pyを作成しました:

おなじみのはずです
import sys 

try: 
    1/0 
except ZeroDivisionError: 
    print sys.exc_info()[2].tb_frame.f_back 

、そして些細なcaller.py:、第2のケースで

$ python demo.py 
None 

$ python caller.py 
<frame object at 0x10bc34c20> 

import demo 

は今の違いを参照してください外側のフレーム(すなわちcaller.py)がある場合、Noneは表示されません。

+0

あなたのコメントはもっと解決策に似ていました...私の質問は私のフレームの知識の欠如の結果でした。今私はフレームをもっとはっきりと知るようになりました...私はあなたのソリューションを編集し、他のフレームでのフレームとf_backの使用に関するいくつかの情報を追加することを提案します。 – Heartagramir

+0

@Heartagramir正確には何か*「他のフレームでのフレームとf_backの使い方についての情報を追加する」*という意味ですか?私が答えることができる具体的な質問がありますか?不明な点は何ですか? – jonrsharpe

+0

私はすべてが分かりました。それは再び感謝の言葉でした。 – Heartagramir

関連する問題