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
posted @ 2023-09-28 17:13  下夕阳  阅读(40)  评论(0)    收藏  举报