我经常发现自己想要做这样的事情,我有一些东西包裹在这样的尝试中
item= get_item()
try:
do_work(item)
except SomeError as err:
if err.code == 123:
do_something(item)
else:
# Actually I don't want to do something with this error code... I want to handle in 'except'
except:
put_back(item)
raise
Run Code Online (Sandbox Code Playgroud)
有没有办法except从其他地方加入下面的区块?(一个continue会很好)我最终做了类似下面的事情,并不是那么干净
item= get_item()
try:
try:
do_work(item)
except SomeError as err:
if err.code == 123:
do_something(item)
else:
raise
except:
put_back(item)
raise
Run Code Online (Sandbox Code Playgroud)
反正有吗?
如果您使用的是最新的python版本(2.5及更高版本),则应切换到使用上下文管理器:
class WorkItemContextManager(object):
def __enter__(self):
self.item = get_item()
return self.item
def __exit__(self, exc_type, exc_value, tb):
if exc_type is not None:
if exc_type is SomeError and exc_value.code == 123:
do_something(self.item)
return True # Exception handled
put_back(self.item)
Run Code Online (Sandbox Code Playgroud)
然后:
with WorkItemContextManager() as item:
do_work(item)
Run Code Online (Sandbox Code Playgroud)
__exit__如果处理了异常,该方法可以返回True; 返回None将重新引发with块中引发的任何异常.
如果没有,你正在寻找一个finally块:
item = get_item()
try:
do_work(item)
item = None
except SomeError as err:
if err.code == 123:
do_something(item)
item = None
finally:
if item is not None:
put_back(item)
Run Code Online (Sandbox Code Playgroud)
该finally套件是保证时要执行try:套件完成,或发生了异常.通过设置item到None你基本上告诉finally套件一切完成就好了,没必要把它放回去.
该finally处理器从你的毯子接管except处理.如果出现异常do_work,item则不会设置为None.如果SomeError处理程序不捕捉异常,或者err.code是不 123,item也将不被设置为无,并因此put_back(item)被执行方法.