我最近在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) –