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

Wil*_*ill 5 python python-3.x

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

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

如果一个函数传播异常,跟踪“回报”的调用,但该说法是Nonesys.exc_info()(None,None,None)。这在文档中描述:

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

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

eca*_*mur 5

这似乎相当破碎。这有点像 hack,但是您可以通过查看最后一条指令的字节码来区分差异:

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')
Run Code Online (Sandbox Code Playgroud)