在 Python 中出错继续下一步

新手上路,请多包涵

片段 1

 do_magic() # Throws exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()

片段 2

 try:
    do_magic() # Doesn't throw exception, doesn't execute do_foo and do_bar
    do_foo()
    do_bar()
except:
    pass

片段 3

 try: do_magic(); except: pass
try: do_foo()  ; except: pass
try: do_bar()  ; except: pass

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

  • 如果 do_magic() 失败与否, do_foo()do_bar() 应该被执行。
  • 如果 do_foo() 失败与否, do_bar() 应该被执行。

在 Basic/Visual Basic/VBS 中,有一个名为 On Error Resume Next 的语句执行此操作。

原文由 Elmo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 463
2 个回答

在 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()

或者, fuckit

原文由 jonrsharpe 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 for f in (do_magic, do_foo, do_bar):
    try:
        f()
    except:
        pass

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

 for f in (do_magic, lambda: do_foo(arg1, arg2)):
    try:
        f()
    except:
        pass

原文由 falsetru 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题