python继续,除非条件不满足

GP8*_*P89 8 python try-catch

我经常发现自己想要做这样的事情,我有一些东西包裹在这样的尝试中

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)

反正有吗?

Mar*_*ers 9

如果您使用的是最新的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:套件完成,发生了异常.通过设置itemNone你基本上告诉finally套件一切完成就好了,没必要把它放回去.

finally处理器从你的毯子接管except处理.如果出现异常do_work,item则不会设置为None.如果SomeError处理程序不捕捉异常,或者err.code 123,item也将不被设置为无,并因此put_back(item)被执行方法.