Snippet 1
do_magic() # Throws exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()
Snippet 2
try:
do_magic() # Doesn't throw exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()
except:
pass
Snippet 3
try: do_magic(); except: pass
try: do_foo() ; except: pass
try: do_bar() ; except: pass
Is there a way to write code snippet 3 elegantly?
if do_magic() fails or not, do_foo() and do_bar() should be executed.
if do_foo() fails or not, do_bar() should be executed.
In Basic/Visual Basic/VBS, there's a statement called On Error Resume Next which does this.
解决方案
In Python 3.4 onwards, you can use 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()
Alternatively, fuckit.