On Error在Python中恢复Next

时间:2014-09-26 12:19:00

标签: python exception error-handling

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

摘录3

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

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

  • 如果do_magic()失败,则应执行do_foo()do_bar()
  • 如果do_foo()失败,则应执行do_bar()

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

7 个答案:

答案 0 :(得分: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()

或者,fuckit

答案 1 :(得分:8)

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

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

答案 2 :(得分:1)

如果您是编写功能的人,为什么不编程函数来返回状态代码?然后它们将是原子的,你不必在主要部分捕获错误。您还可以在失败时执行回滚或备用编码。

def do_magic():
    try:
        #do something here
        return 1
    except:
        return 0
主程序中的

..

if do_magic() = 0:
   #do something useful or not...

if do_foo() = 0:
   #do something useful or not...

if do_bar() = 0:
   #do something useful or not...

答案 3 :(得分:0)

你可以尝试一个嵌套的'try'循环,所有这可能不像你想要的那样优雅pythonic。 'lambda'解决方案也是一个很好的方法,没有提及,因为它是在上一个答案中完成的

编辑:

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

编辑2:

好吧,这个答案刚刚提前几秒发布:|

答案 4 :(得分:0)

很多身份,但它有效

try:
    do_magic()
finally:
    try:
        do_foo()
    finally:
        try:
            do_bar()
        finally:
            pass

答案 5 :(得分:0)

在这个问题中,代码段3不起作用,但是如果你不介意将每一行分成两行,那么它将起作用......

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

一个工作实例..

import sys
a1 = "No_Arg1"
a2 = "No_Arg2"
a3 = "No_Arg3"
try: a1 = sys.argv[1]
except: pass
try: a2 = sys.argv[2]
except: pass
try: a3 = sys.argv[3]
except: pass

print a1, a2, a3

..如果你将它保存到test.py然后在Windows中的CMD提示符下输入test.py它将返回No_Arg1 No_Arg2 No_Arg3,因为没有参数。但是,如果您提供一些参数,如果键入test.py 111 222,它将返回111 222 No_Arg3等。 (已测试 - Windows 7,python2.7)。

恕我直言,这比嵌套示例回复要优雅得多。它的工作方式与On Error Resume Next完全相同,我在从VB6翻译时使用它。一个问题是try行不能包含条件。我发现通常,python不能在一行中包含多个:。也就是说,它只是意味着将语句拆分为3行等。

答案 6 :(得分:0)

如果没有参数......

funcs = do_magic, do_foo, do_bar

for func in funcs:
    try:
        func()
    except:
        continue