类有一个可定义的函数__exit__,可以实现上下文管理器.

它采用所需的参数:

def __exit__(self, exc_型, exc_val, exc_tb):

但我找不到关于这些论点是什么及其类型的明确定义.

以下是我对它们是什么以及为什么的最佳猜测,但我不完全确定:

def __exit__(self, exc_型: Exception, exc_val: TracebackException, exc_tb: TracebackType):

exc_型

Python定义了一个TracebackException类,该类接受exc_型参数,该参数在issubclassSyntaxError中的构造函数中上下文使用,从而推断exc_型实际上是Exception的某种类型,SyntaxError继承自Exception.

exc_val

另外,在TracebackException类中有一个exc_value参数,它与exc_val匹配,exc_val似乎有各种属性,比如__cause____context__,以及TracebackType本身定义的其他属性.这让我觉得这个参数本身就是TracebackException的一个实例.

exc_tb

Python定义了一个walk_tb函数,它使用exc_tb作为参数(从docs.python.org手动跟踪),这个对象似乎有tb_frametb_linenotb_next个属性,这些属性可以追溯到typeshed库中的TracebackType类.

思想?

推荐答案

exc_type是异常的类.exc_val是例外情况.exc_tb是一个回溯对象,types.TracebackType中有一个引用.

一般来说,情况应该是

  • type(exc_val) is exc_type
  • exc_val.__traceback__ is exc_tb

请注意,当上下文管理器下的代码没有引发异常时,仍然会调用__exit__,并且args将为(None, None, None),因此所有三个参数都应注释为optional.

那么它的正确注释应该如下所示:

def __exit__(self, exctype: Optional[Type[BaseException]],
             excinst: Optional[BaseException],
             exctb: Optional[TracebackType]) -> bool: ...

您可能想知道为什么这个API有三个参数,而其中两个参数可以从异常实例本身轻松确定.但情况并非总是这样,在较旧版本的Python中,可以将字符串作为异常引发,而异常的__traceback__属性并不存在.在Python2.7中,您仍然可以将旧式类作为例外提出(!)

Python-3.x相关问答推荐

使用Python请求从特定URL下载图像时出错

Python根据阈值对数字进行分组

无法导入名称';核心';来自部分初始化的模块';tensorflow_datasets';(很可能是由于循环导入)

将列表转换为 pandas 数据框,其中列表包含字典

将两列的乘积连续添加到一列的累积和中

如何立即从asyncio.Task获取异常?

为什么 numpy 的 `np.char.encode` 会将一个空的 unicode 数组变成一个空的 `float64` 数组?

Python rolling_corr 取消后,应该用什么方法来处理

机器学习实验笔记本的工作区 url

从 h264 帧解析数据包时 PyAV 不一致

命名元组内命名元组的 Python 语法

如何模拟 Django 模型对象(及其方法)?

是否有与 Laravel 4 等效的 python?

为什么在 Python 中不推荐使用 MutableString?

BeautifulSoup 的 Python 3 兼容性

从大字典中弹出 N 项的最快方法

在不关心项目的情况下运行生成器功能的更简单方法

如何在python中创建代码对象?

python - Pandas - Dataframe.set_index - 如何保留旧的索引列

什么是ANSI_X3.4-1968编码?