Python traceback 与 warnings
Python traceback 与 warnings 的完整教学讲解。
traceback 打印异常
基本写法:打印当前异常
traceback.print_exc()
# 打印当前异常栈到 stderr
import traceback
try:
1 / 0
except Exception:
traceback.print_exc()
基本写法:格式化异常字符串
traceback.format_exc()
# 获取异常栈字符串
try:
1 / 0
except Exception:
msg = traceback.format_exc()
print(msg)
基本写法:打印指定异常
traceback.print_exception(<异常>)
# 打印指定异常对象
try:
raise ValueError("test")
except ValueError as e:
traceback.print_exception(e)
基本写法:格式化指定异常
traceback.format_exception(<异常>)
# 返回异常信息行列表
try:
raise ValueError("test")
except ValueError as e:
lines = traceback.format_exception(e)
print("".join(lines))
traceback 提取栈帧
基本写法:提取当前栈
traceback.extract_stack()
# 获取当前调用栈帧列表
frames = traceback.extract_stack()
for f in frames:
print(f.filename, f.lineno, f.name)
基本写法:提取指定栈
traceback.extract_tb(<tb>)
# 从 traceback 对象提取帧
try:
1 / 0
except ZeroDivisionError as e:
frames = traceback.extract_tb(e.__traceback__)
for f in frames:
print(f.filename, f.lineno, f.name, f.line)
基本写法:StackSummary 对象
traceback.StackSummary.extract(<帧>)
# 3.5+ StackSummary 对象
summary = traceback.StackSummary.extract(traceback.walk_stack(None))
print(summary.format())
基本写法:format_list 格式化帧
traceback.format_list(<帧列表>)
# 格式化帧列表
frames = traceback.extract_stack()
print("".join(traceback.format_list(frames)))
traceback 装饰器
基本写法:异常装饰器
def <装饰器>(func):\n @functools.wraps(func)\n def wrapper(*a, **k):
# 捕获异常并记录完整 traceback
import functools
import traceback
import logging
def log_exceptions(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception:
logging.error(traceback.format_exc())
raise
return wrapper
warnings 警告控制
基本写法:发出警告
warnings.warn(<消息>, <警告类>)
# 发出警告
import warnings
def deprecated_func():
warnings.warn("该函数已弃用", DeprecationWarning)
return "old"
基本写法:警告类别
UserWarning | DeprecationWarning | RuntimeWarning
# 常用警告类别
warnings.warn("用户警告", UserWarning)
warnings.warn("弃用警告", DeprecationWarning)
warnings.warn("运行时警告", RuntimeWarning)
warnings.warn("资源警告", ResourceWarning)
基本写法:过滤警告
warnings.filterwarnings(<动作>, <消息正则>, <类别>)
# 过滤警告
warnings.filterwarnings("ignore", category=DeprecationWarning)
warnings.filterwarnings("error", category=UserWarning)
基本写法:simplefilter 简化过滤
warnings.simplefilter(<动作>, <类别>)
# 简化过滤
warnings.simplefilter("ignore")
warnings.simplefilter("always", UserWarning)
基本写法:动作选项
"error" | "ignore" | "always" | "default" | "module" | "once"
# 警告动作
warnings.simplefilter("error") # 警告转异常
warnings.simplefilter("ignore") # 忽略
warnings.simplefilter("always") # 总是显示
warnings 上下文管理
基本写法:catch_warnings 临时过滤
with warnings.catch_warnings():
# 临时修改警告过滤
with warnings.catch_warnings():
warnings.simplefilter("ignore")
deprecated_func()
基本写法:捕获警告记录
with warnings.catch_warnings(record=True) as w:
# 捕获警告到列表
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
deprecated_func()
for warning in w:
print(warning.category.__name__, warning.message)
基本写法:指定模块过滤
warnings.filterwarnings(<动作>, module=<模块正则>)
# 仅对特定模块过滤
warnings.filterwarnings("ignore", module="legacy_lib.*")
warnings 子类化
基本写法:自定义警告类
class <警告类>(Warning):
# 自定义警告类别
class ConfigWarning(UserWarning):
pass
warnings.warn("配置问题", ConfigWarning)
基本写法:deprecated 装饰器(3.13+)
@warnings.deprecated(<消息>)
# Python 3.13 内置弃用装饰器
@warnings.deprecated("使用 new_func 替代")
def old_func():
pass
命令行控制警告
基本写法:命令行参数
python -W <动作>:<消息>:<类别>:<模块>:<行号>
# 命令行控制警告
# python -W ignore::DeprecationWarning main.py
# python -W error::UserWarning main.py
基本写法:环境变量
PYTHONWARNINGS=<过滤>
# 通过环境变量设置
# set PYTHONWARNINGS=ignore::DeprecationWarning
sys 异常信息
基本写法:sys.exc_info
sys.exc_info()
# 获取当前异常信息三元组
import sys
try:
1 / 0
except ZeroDivisionError:
exc_type, exc, tb = sys.exc_info()
print(exc_type, exc)
基本写法:异常链
raise <异常> from <原异常>
# 异常链
try:
int("abc")
except ValueError as e:
raise RuntimeError("处理失败") from e
基本写法:suppress 上下文
raise <异常> from None
# 抑制异常上下文
raise RuntimeError("独立错误") from None
基本写法:cause 与 context
exc.__cause__ | exc.__context__
# 访问异常链
try:
try:
1 / 0
except ZeroDivisionError as e:
raise RuntimeError("wrap") from e
except RuntimeError as e:
print(e.__cause__)