我经常发现自己想要做这样的事情,我有一些东西包裹在这样的尝试中
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)被执行方法.