处理settrace'return'调用中的异常

时间:2012-10-09 07:08:34

标签: python python-3.x

在Python 2.x中,传递给settrace处理程序的框架对象具有f_exc_type属性。

在Python 3.x中,此f_exc_type已被删除。

如果函数传播异常,则会调用跟踪“return”,但参数为Nonesys.exc_info()(None,None,None)。这在docs

中有所描述
  

[return]函数(或其他代码块)即将返回。本地痕迹   函数被调用; arg是将返回的值,如果是,则为None   该事件是由引发异常引起的。跟踪功能   返回值被忽略。

在Python 3中,跟踪器如何在return钩子中确定正在传播异常?它如何区别于正常返回None的函数?

1 个答案:

答案 0 :(得分:3)

这似乎相当破碎。这有点像黑客,但你可以通过查看最后一条指令的字节码来区分它们:

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')