dth*_*hor 2 python error-handling exception-handling
是否有更清洁或更pythonic的方式来做以下事情?
try:
error_prone_function(arg1)
except MyError:
try:
error_prone_function(arg2)
except MyError:
try:
another_error_prone_function(arg3)
except MyError:
try:
last_error_prone_function(arg4)
except MyError:
raise MyError("All backup parameters failed.")
Run Code Online (Sandbox Code Playgroud)
基本上是:如果尝试#1失败,请尝试#2.如果#2失败,请尝试#3.如果#3失败,请尝试#4.如果#4失败,......如果#n失败,那么最后会引发一些异常.
请注意,我不一定每次调用相同的函数,也不是每次都使用相同的函数参数.我是,但是,期待相同的异常MyError各项功能.
dth*_*hor 12
感谢John Kugelman的帖子在这里,我决定去与此,它利用鲜为人知else的子句循环当整个名单已经没有用尽执行代码break发生.
funcs_and_args = [(func1, "150mm"),
(func1, "100mm",
(func2, "50mm"),
(func3, "50mm"),
]
for func, arg in funcs_and_args :
try:
func(arg)
# exit the loop on success
break
except MyError:
# repeat the loop on failure
continue
else:
# List exhausted without break, so there must have always been an Error
raise MyError("Error text")
Run Code Online (Sandbox Code Playgroud)
正如丹尼尔罗斯曼在下面评论的那样,要小心缩进,因为该try陈述也有一个else条款.