首页 > 解决方案 > 尝试不同的功能,直到不抛出异常

问题描述

我有一些函数可以根据一组输入数据尝试各种方法来解决问题。如果该方法无法解决问题,则该函数将引发异常。

我需要按顺序尝试它们,直到不抛出异常。

我正在尝试找到一种优雅地做到这一点的方法:

try:
    answer = method1(x,y,z)
except MyException:
    try:
        answer = method2(x,y,z)
    except MyException:
        try:
            answer = method3(x,y,z)
        except MyException:
            ...

在伪代码中,我的目标是:

tryUntilOneWorks:
    answer = method1(x,y,z)
    answer = method2(x,y,z)
    answer = method3(x,y,z)
    answer = method4(x,y,z)
    answer = method5(x,y,z)
except:
    # No answer found

要明确:method2除非失败,否则不得调用method1,依此类推。

标签: pythonpython-3.x

解决方案


鉴于 Python 函数是第一类对象,您可以将它们添加到序列中:

methods = [method1, method2, method3, ..., methodN]

在这种情况下,将列表中的每一项应用于您的论点直到没有失败是很简单的:

def find_one_that_works(*args, **kwargs):
    for method in methods:
        try:
            return method(*args, **kwargs)
        except MyException:
            pass
    raise MyException('All methods failed')

推荐阅读