5

settracePython 2.xでは、ハンドラーに渡されるフレームオブジェクトにf_exc_type属性がありました。

Python 3.xでは、これf_exc_typeは削除されました。

関数が例外を伝播している場合、トレース'return'が呼び出されますが、引数はNoneであり、sys.exc_info()です(None,None,None)。これはドキュメントで説明されています:

[return]関数(または他のコードブロック)が返されようとしています。ローカルトレース関数が呼び出されます。argは返される値であり、イベントが発生した例外によって発生した場合はNoneです。トレース関数の戻り値は無視されます。

return Python 3では、例外が伝播されていることをトレーサーがフックでどのように判断できますか?正常に戻る関数とどのように区別できNoneますか?

4

1 に答える 1

5

これはかなり壊れているようです。ちょっとハックですが、最後の命令のバイトコードを見ると違いがわかります。

import opcode

def tracer(frame, event, arg):
    if event == 'return':
        if arg is not None or (opcode.opname[frame.f_code.co_code[frame.f_lasti]]
                               in ('RETURN_VALUE', 'YIELD_VALUE')):
            print('exit via return', arg)
        else:
            print('exit via exception')
于 2012-10-09T13:15:36.677 に答える