异常链是Python中一个重要的概念,它允许在捕获一个异常后抛出另一个异常,同时保留原始异常的信息。
def process_data():
try:
# 模拟一个原始异常
raise ValueError("原始数据错误")
except ValueError as e:
# 在处理过程中抛出新的异常
raise RuntimeError("处理数据时发生错误") from e
try:
process_data()
except RuntimeError as e:
print(f"捕获的异常: {e}")
print(f"原始异常: {e.__cause__}")
'''
输出:
捕获的异常: 处理数据时发生错误
原始异常: 原始数据错误
'''
异常链的两种形式
隐式异常链
当在except块中抛出新的异常时,Python会自动创建异常链。
def implicit_chaining():
try:
# 第一个异常
raise ValueError("第一个错误")
except ValueError:
# 在except块中直接抛出新异常
raise RuntimeError("第二个错误")
try:
implicit_chaining()
except RuntimeError as e:
print(f"当前异常: {e}")
print(f"隐式上下文: {e.__context__}")
'''
输出:
当前异常: 第二个错误
隐式上下文: 第一个错误
'''
显式异常链
使用raise ... from ...语法明确指定异常链关系。
def explicit_chaining():
try:
raise ValueError("原始错误")
except ValueError as original_error:
# 明确指定异常链
raise RuntimeError("新错误") from original_error
try:
explicit_chaining()
except RuntimeError as e:
print(f"当前异常: {e}")
print(f"显式原因: {e.__cause__}")
''''
输出:
当前异常: 新错误
显式原因: 原始错误
'''
异常链的属性
| 属性 | 描述 |
|---|---|
__cause__ |
使用from明确指定的直接原因 |
__context__ |
自动捕获的上下文异常 |
__traceback__ |
异常的跟踪信息 |