说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 Python 中,异常上下文是指异常发生时的环境信息,包括导致异常的代码片段、异常类型、异常消息等。异常上下文对于调试和理解代码中的错误非常重要。Python 的异常上下文通过异常堆栈来展示,堆栈跟踪会显示异常发生时的调用链,从而可以追溯到异常的根源。
当一个异常被抛出时,Python 解释器会收集有关异常发生位置的信息,并将其保存在异常对象中。在异常被处理或者未被处理时,这些信息都可以被访问到。
以下是一个简单的示例,展示了异常上下文的使用:
try:
# Cause an exception
1 / 0
except ZeroDivisionError as e1:
try:
# Raise another exception with the previous one as the cause
raise ValueError("Invalid value") from e1
except ValueError as e2:
print("Exception:", e2)
print("e2.__cause__:", e2.__cause__)
print("e2.__context__:", e2.__context__)
print("e2.__suppress_context__:", e2.__suppress_context__)
输出:
'''
Exception: Invalid value
e2.__cause__: division by zero
e2.__context__: division by zero
e2.__suppress_context__: True
'''
示例中,ZeroDivisionError 异常作为原因异常,被捕获后引发了 ValueError 异常。在 ValueError 异常中,__cause__
属性引用了先前的 ZeroDivisionError 异常,而 __context__
则为空。
在实际的开发中,理解异常上下文对于调试和修复代码中的错误非常重要。异常堆栈跟踪会显示调用链中的所有函数和方法,从而帮助确定异常发生的原因。
异常对象上的三个属性提供了有关引发异常所在上下文的信息:
BaseException.__context__
BaseException.__cause__
BaseException.__suppress_context__
当有其他异常已经被处理的情况下又引发一个新异常的时候,新异常的 __context__
属性会被自动设为已经被处理的异常。 异常可以在使用了 except 或 finally 子句,或者 with 语句的时候被处理。
在 Python 中,BaseException 类具有以下属性:
__context__
:此属性包含导致当前异常的先前异常(如果有的话)。当一个异常是另一个异常的直接结果时,它的 __context__
属性将引用先前的异常。这在异常链中很有用,因为它允许开发人员跟踪异常的传播路径。如果没有先前的异常,则 __context__
为 None。__cause__
:此属性指示当前异常的原因异常(如果有的话)。这是用于表示一个异常是由另一个异常引起的。与 __context__
不同,__cause__
指示当前异常的直接原因。如果没有原因异常,则 __cause__
为 None。__suppress_context__
:此属性用于控制在打印异常时是否忽略上下文信息。默认情况下,当一个异常的 __cause__
或 __context__
不为 None 时,上下文信息会被打印出来。如果将 __suppress_context__
设置为 True,则上下文信息将被抑制。这个隐式异常上下文可以通过使用 from 配合 raise 来补充一个显式的原因:
raise new_exc from original_exc
跟在 from 之后的表达式必须为一个异常或 None。 它将在所引发的异常上被设为 __cause__
。 设置 __cause__
还会隐式地将 __suppress_context__
属性设为 True,这样使用 raise new_exc from None
可以有效地将旧异常替换为新异常来显示其目的 (例如将 KeyError 转换为 AttributeError),同时让旧异常在 __context__
中保持可用以便在调试时执行内省。
除了异常本身的回溯以外,默认的回溯还会显示这些串连的异常。 __cause__
中的显式串连异常如果存在将总是显示。 __context__
中的隐式串连异常仅在 __cause__
为 None 且 __suppress_context__
为假值时显示。
不论在哪种情况下,异常本身总会在任何串连异常之后显示,以便回溯的最后一行总是显示所引发的最后一个异常。
更新时间:2024-04-06 09:13:40 标签:python 异常 上下文