do_magic() # Throws exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()
try:
do_magic() # Doesn't throw exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()
except:
pass
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
的语句可以执行此操作。
答案 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