On Error在Python中恢复Next

Elm*_*lmo 9 python error-handling exception

片段1

do_magic() # Throws exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()
Run Code Online (Sandbox Code Playgroud)

片段2

try:
    do_magic() # Doesn't throw exception, doesn't execute do_foo and do_bar
    do_foo() 
    do_bar()
except:
    pass
Run Code Online (Sandbox Code Playgroud)

代码段3

try: do_magic(); except: pass
try: do_foo()  ; except: pass
try: do_bar()  ; except: pass
Run Code Online (Sandbox Code Playgroud)

有没有办法优雅地编写代码片段3?

  • 如果do_magic()失败或没有,do_foo()do_bar()应该执行.
  • 如果do_foo()失败,do_bar()应该执行.

在Basic/Visual Basic/VBS中,有一个语句叫做On Error Resume Next这个.

jon*_*rpe 14

在Python 3.4及更高版本中,您可以使用contextlib.suppress:

from contextlib import suppress

with suppress(Exception): # or, better, a more specific error (or errors)
    do_magic()
with suppress(Exception):
    do_foo()
with suppress(Exception):
    do_bar()
Run Code Online (Sandbox Code Playgroud)

或者,fuckit.


fal*_*tru 8

如果所有三个函数都接受相同数量的参数:

for f in (do_magic, do_foo, do_bar):
    try:
        f()
    except:
        pass
Run Code Online (Sandbox Code Playgroud)

否则,用函数调用包装lambda.

for f in (do_magic, lambda: do_foo(arg1, arg2)):
    try:
        f()
    except:
        pass
Run Code Online (Sandbox Code Playgroud)