python exception
exception
使用exception是为了程序健壮性考虑,在程序退出的时候做好文件关闭,资源释放等工作,当然清晰的提示也是很重要。
import traceback
fid = open()
try:
pass
except Exception as e:
print(traceback.format_exc()) # 不像print(e),只打印最后出错,而是会递归的找到最开始出错的地方
finally:
fid.close()
traceback模块
traceback可以获取出错的堆栈信息和错误内容信息,stack+error_info
- exception->e:只包含了错误信息
- inspect.stack():只包含了堆栈信息
- traceback.print_exc() = print(e) + inspect.stack()
控制堆栈的层级
# 只获取错误信息
print(e)
print(traceback.format_exc(0))
traceback.print_exc(0)
# 显示最后一级堆栈信息+错误信息
print(traceback.format_exc(1))
traceback.print_exc(1)
# 显示所有堆栈信息+错误信息
print(traceback.format_exc())
traceback.print_exc()
# 只显示堆栈信息
print(traceback.format_stack())
traceback.print_stack()
结合sys.exc_info(),控制堆栈的层次
import sys
import traceback
def func_a():
func_b()
def func_b():
func_c()
def func_c():
try:
1 / 0
except:
# 获取当前异常信息
exc_type, exc_value, exc_tb = sys.exc_info()
# 提取栈帧摘要(列表)
stack_summary = traceback.extract_tb(exc_tb)
# 只保留最后 2 层(最近的调用)
limited_stack = stack_summary[-2:] # ← 关键:切片控制层数
# 格式化为字符串
formatted_lines = traceback.format_list(limited_stack)
# 手动加上异常类型和值
error_header = ''.join(traceback.format_exception_only(exc_type, exc_value))
# 拼接完整 traceback(但只有指定层数)
full_trace = ['Traceback (limited):\n'] + formatted_lines + [error_header]
print(''.join(full_trace))
func_a()
Traceback (limited):
File "test.py", line 14, in func_b
func_c()
File "test.py", line 18, in func_c
1 / 0
ZeroDivisionError: division by zero

浙公网安备 33010602011771号