我最近在Python的with-statement语句中遇到了一个奇怪的行为。我有一个代码,它使用Python的上下文管理器来回滚__exit__
方法中的配置更改。经理在__exit__
的finally块中有return False
值。我隔离在下面的代码的情况下 - 唯一的区别是return语句的缩进:在python上下文管理器中返回finally块
class Manager1(object):
def release(self):
pass # Implementation not important
def rollback(self):
# Rollback fails throwing an exception:
raise Exception("A failure")
def __enter__(self):
print "ENTER1"
def __exit__(self, exc_type, exc_val, exc_tb):
print "EXIT1"
try:
self.rollback()
finally:
self.release()
return False # The only difference here!
class Manager2(object):
def release(self):
pass # Implementation not important
def rollback(self):
# Rollback fails throwing an exception:
raise Exception("A failure")
def __enter__(self):
print "ENTER2"
def __exit__(self, exc_type, exc_val, exc_tb):
print "EXIT2"
try:
self.rollback()
finally:
self.release()
return False # The only difference here!
在回滚上面的代码中有一个异常失败的。我的问题是,为什么Manager1
的行为不同于Manager2
。在Manager1
中的with-statement之外没有抛出异常,以及为什么它在Manager2
退出时抛出。
with Manager1() as m:
pass # The Exception is NOT thrown on exit here
with Manager2() as m:
pass # The Exception IS thrown on exit here
如果一个异常被提供,并且该方法希望抑制 异常(即,防止它被传播)时,它应该返回一个 真值。否则,在从此方法退出 时,异常将被正常处理。
在我在这两种情况下出口没有返回真实想法,因此异常不应该在这两种情况下supressed。然而在Manager1中是这样的。任何人都可以解释吗?
我使用Python 2.7.6。
请参阅[return eats exception](http://stackoverflow.com/q/517060/222914) –