【发布时间】:2021-03-13 04:06:03
【问题描述】:
我有一个类Test,它是另一个类的子类(它已经是一个上下文管理器,为了简单起见,我在这里选择了nullcontext)。
如何避免重复try/except 块,并将其直接在类中定义?
与Avoiding Multiple Try/Except blocks in Python 及其答案不同,我想使用类而不是创建新函数。
例子:
import contextlib
class Test(contextlib.nullcontext):
pass
try:
with Test('abc') as t1:
do_something(t1)
do_something_else()
except ValueError: # these exceptions are thrown from Test's parent
print('a') # class/context-manager methods (nullcontext in this example)
except KeyError:
print('b')
try:
with Test('def') as t2:
do_something(t2)
do_this(t2)
except ValueError:
print('a')
except KeyError:
print('b')
TL;DR:如何将 try:、except ValueError:、except KeyError: 移动到 Test 类中?
【问题讨论】:
-
由于看到代码重复,我有制作函数或将代码置于循环中的动机。有什么你没有展示的东西会改变我的动机吗?
-
@quamrana 不是循环:我简化了我的真实情况,但他们做的事情不一样,而且他们有不同的论点,想象不同的
Test(param1=..., param2=...)调用,以及块pass非常不同。 -
我认为你过度简化了你的例子,你期望从哪里抛出 ValueError 或 KeyError ?如果错误发生在 Test.method() 内部,为什么不让 test.method 自己处理错误呢?
-
@JeffUK 这就是准确的一点,我应该补充一点:这些异常是从父类/上下文管理器(在我的示例中为
nullcontext)抛出的。 -
什么时候扔?什么时候创建对象?如果它们是从 init 抛出的,您是否可以覆盖 init,使用错误处理包装对父 init 的调用?
标签: python class exception try-catch contextmanager