在Python 2.x中,传递给settrace
处理程序的框架对象具有f_exc_type
属性。
在Python 3.x中,此f_exc_type
已被删除。
如果函数传播异常,则会调用跟踪“return”,但参数为None
且sys.exc_info()
为(None,None,None)
。这在docs:
[return]
函数(或其他代码块)即将返回。本地痕迹 函数被调用; arg是将返回的值,如果是,则为None 该事件是由引发异常引起的。跟踪功能 返回值被忽略。
在Python 3中,跟踪器如何在return
钩子中确定正在传播异常?它如何区别于正常返回None
的函数?
答案 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')