9 Python对象-内部类型之帧对象&跟踪记录对象
帧对象
帧对象:栈帧(Frame)是执行环境的一个抽象表示,是Python的执行栈帧。,它是执行一个函数时创建的。每个栈帧都保存了函数的局部变量、调用参数、返回值以及指向父栈帧的链接(如果有的话,即调用当前函数的栈帧)。
帧对象包含Python解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码对象,本地及全局名称空间字典及当前指令等。每次函数调用产生一个新的帧,每个帧对象都会相应创建一个C语言级别的栈帧。用到帧对象的事跟踪记录对象。
import inspect
def outer_function():
x = 10
inner_function()
def inner_function():
# 获取当前栈帧
current_frame = inspect.currentframe()
# 获取当前栈帧的上一个栈帧(即调用它的栈帧)
outer_frame = current_frame.f_back
# 打印当前栈帧的局部变量
print("Inner function local variables:", current_frame.f_locals)
# 打印外部函数的局部变量(通过外部栈帧)
print("Outer function local variables:", outer_frame.f_locals)
# 注意:在Python 3.7及更高版本中,直接访问栈帧的局部变量可能会受到限制或警告
# 因为这可能会破坏Python的解释器优化和封装
outer_function()
输出结果:
Inner function local variables: {'current_frame': , 'outer_frame': }
Outer function local variables: {'x': 10}
跟踪记录对象
当异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建。如果异常有自己的处理程序,处理程序可以访问这个跟踪记录对象。
import traceback
def divide(x, y):
try:
result = x / y
except Exception as e:
# 获取并存储异常的堆栈跟踪信息
exc_info = traceback.format_exc()
print("Error occurred:", exc_info)
# 你可以将exc_info写入日志文件等
divide(10, 0)
关键函数
- traceback.print_exc()
- traceback.format_exc()
- traceback.extract_tb(tb, limit=None)
- traceback.format_tb(tb, limit=None)
- traceback.format_stack(f=None, limit=None)
traceback.TracebackException 类
从Python 3.5开始,traceback模块引入TracebackException类,它提供了一个更面向对象的接口来处理堆栈跟踪。这个类可以捕获当前的异常堆栈跟踪,并允许你以编程方式访问和格式化它。
- cebackException实例。你需要提供异常类型、异常值和回溯对象。limit、lookup_lines和capture_locals参数控制堆栈跟踪的生成方式。
- format(self, *args, **kwargs)类似于traceback.format_exc(),但它是TracebackException实例的方法。它允许你以多种格式(如plain、context等)格式化堆栈跟踪。
- format_tb(self, *args, **kwargs)类似于traceback.format_tb(),但它是TracebackException实例的方法。它返回堆栈跟踪的格式化列表。