gpt4 book ai didi

python - 在 Python 的调用代码中捕获 __enter__ 中的异常

转载 作者:行者123 更新时间:2023-11-28 17:40:39 25 4
gpt4 key购买 nike

有没有一种方法可以在上下文管理器的 __enter__ 方法中捕获异常,而无需将整个 with block 包装在 try 中?

class TstContx(object):
def __enter__(self):
raise Exception("I'd like to catch this exception")
def __exit__(self, e_typ, e_val, trcbak):
pass


with TstContx():
raise Exception("I don't want to catch this exception")
pass

我知道我可以在 __enter__() 本身中捕获异常,但是我可以从包含 with 语句的函数访问该错误吗?

从表面上看问题Catching exception in context manager __enter__()似乎是同一件事,但这个问题实际上是关于确保 __exit__ 被调用,而不是将 __enter__ 代码与 with语句附上。

...显然动机应该更清楚。 with 语句正在为完全自动化的过程设置一些日志记录。如果程序在设置日志记录之前失败,那么我不能依赖日志记录来通知我,所以我必须做一些特别的事情。我宁愿在不必添加更多缩进的情况下实现效果,如下所示:

try:
with TstContx():
try:
print "Do something"
except Exception:
print "Here's where I would handle exception generated within the body of the with statement"
except Exception:
print "Here's where I'd handle an exception that occurs in __enter__ (and I suppose also __exit__)"

使用两个 try block 的另一个缺点是 __enter__ 中处理异常的代码出现在 后续主体中处理异常的代码之后用 block 。

最佳答案

可以在__enter__中使用try/except捕获异常,然后将异常实例保存为的实例变量>TstContx 类,允许您在 with block 中访问它:

class TstContx(object):
def __enter__(self):
self.exc = None
try:
raise Exception("I'd like to catch this exception")
except Exception as e:
self.exc = e
return self

def __exit__(self, e_typ, e_val, trcbak):
pass

with TstContx() as tst:
if tst.exc:
print("We caught an exception: '%s'" % tst.exc)
raise Exception("I don't want to catch this exception")

输出:

We caught an exception: 'I'd like to catch this exception'.
Traceback (most recent call last):
File "./torn.py", line 20, in <module>
raise Exception("I don't want to catch this exception")
Exception: I don't want to catch this exception

但不确定您为什么要这样做......

关于python - 在 Python 的调用代码中捕获 __enter__ 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24878601/

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