更多pythonic方式来处理嵌套尝试...除了块?

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条款.

  • 在这里要特别小心缩进:try/except*also*有一个else子句,所以很容易将它放在错误的地方. (4认同)