在 Python 2.x 中,传递给settrace处理程序的框架对象有一个f_exc_type属性。
在 Python 3.x 中,这f_exc_type已被删除。
如果一个函数传播异常,跟踪“回报”的调用,但该说法是None和sys.exc_info()是(None,None,None)。这在文档中描述:
[return]一个函数(或其他代码块)即将返回。调用本地跟踪函数;arg 是将返回的值,如果事件是由引发的异常引起的,则为 None。跟踪函数的返回值被忽略。
在 Python 3 中,跟踪器如何在return 钩子中确定正在传播异常?它如何与正常返回的函数区分开None来?
这似乎相当破碎。这有点像 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)
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |