gpt4 book ai didi

python - 如何抑制上下文管理器中的给定异常?

转载 作者:太空宇宙 更新时间:2023-11-04 05:40:29 24 4
gpt4 key购买 nike

在尝试忽略上下文管理器执行期间引发的异常时,我有哪些选择?照原样,以下简单的上下文管理器只是传播导致它结束执行的结果,除非被捕获:

class contextMan:    
def __enter__(self):
print("Entering Context")

def __exit__(self, exc_type, exc_value, traceback):
print("Exiting Context")

if __name__ == "__main__":
with contextMan():
raise IndexError

我当然可以将它放在 try -- except 子句中,但这似乎是一种相当乏味的方法。当然,有更好的选择来解决这个问题。

最佳答案

除了将其包装在 try 语句中,还有两种其他方法可以在上下文管理器中抑制给定的异常:

  1. 使用 if 条件返回 True 如果给定的异常应该被抑制。这是基于 documentation它指定 True 值抑制异常。

    这将适用于 Python 2.xPython 3.x 版本。

  2. 使用 contextlib.suppress以给定的异常名称作为参数。

    这仅适用于版本 > 3.3


第一个选项是一个值得注意的选项,因为它适用于大多数 Python,因此具有可移植性。它可以简单地通过使用所需的异常初始化上下文管理器并在 __exit__ 上添加一个 if 子句来完成,该子句仅允许给定的异常传播:

class contextMan:    
def __init__(self, exception):
self.exception = exception

def __enter__(self):
print("Entering Context")

def __exit__(self, exc_type, exc_value, traceback):
print("Exiting Context")
return isinstance(exc_value, self.exception)

if __name__ == "__main__":
with contextMan(IndexError):
raise IndexError

这将抑制 IndexError 的任何实例或 IndexError 的子类的任何实例,从而导致输出:

Entering Context
Exiting Context

这种方法的缺点是您要为每个实例添加一个额外的属性,并且实质上是将两个不同的逻辑任务组合在一个对象中,而不是将它们分开。


第二个选项更稳健明确一般。它是专门为这类场景创建的。它也是一个上下文管理器,因此通常可以在任何应该抑制特定异常的情况下使用。

它的调用签名是这样的形式:

 contextlib.suppress(*exceptions) 

其中 *exceptions 是要抑制的异常元组。保持原来的上下文管理器不变,我们现在可以创建一个嵌套的上下文管理器,它也可以抑制特定的异常:

class contextMan:    
def __enter__(self):
print("Entering Context")

def __exit__(self, exc_type, exc_value, traceback):
print("Exiting Context")

if __name__ == "__main__":
with contextlib.suppress("IndexError")
with contextMan():
raise IndexError

也可以将其写在同一行,但这会导致语句相当冗长。这样做的明显缺点是每次使用上下文管理器时都会引入另一个语句。

即使有两种选择,应该有一种——最好只有一种——显而易见的方法,我相信第二种是显而易见的方式(至少对于最近的版本)。

关于python - 如何抑制上下文管理器中的给定异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com