5

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

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

如果函数正在传播异常,则调用跟踪“return”,但参数 isNonesys.exc_info()is (None,None,None)。这在文档中有所描述:

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

在 Python 3 中,跟踪器如何在return 挂钩中确定正在传播异常?它如何与正常返回的函数区分开来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 回答