展平嵌套的try/except子句

Lon*_*Rob 4 python python-3.x

我想在同一个任务中尝试许多不同的方法,每次方法失败时捕获异常.我知道如果尝试失败将引发的异常(并且每次尝试可能会有所不同).在最后一次尝试之后,我想优雅地放弃并继续前进.

我目前通过嵌套try/ except子句来做到这一点:

try:
    first_approach()
except Exception1:
    try:
        second_approach()
    except Exception2:
        try:
            third_approach()
        except:
            give_up()
except Exception2:
    try:
        third_approach()
    except:
        give_up()
Run Code Online (Sandbox Code Playgroud)

但这对我来说很糟糕,因为third_approach()重复了.我在Python文档中看不到任何帮助.那么我怎样才能展平这个丑陋的嵌套代码呢?

一个具体的例子

例如,想象一下我试图读取CSV文件列表,而不事先知道它们的编码.

某些CSV文件甚至可能是通过文件扩展名伪装成CSV的XLS文件.

因此,我想尝试一些不同的编码,如果这些编码都不起作用,请尝试将文件读作excel.

for f in files:
    try:
        read_csv(f, encoding='utf-8')
    except UnicodeDecodeError:
        try:
            read_csv(f, encoding='latin1')
        except NotCsvError:
            try:
                read_excel(f)
            except:
                give_up()
    except NotCsvError:
        try:
            read_excel(f)
        except:
            give_up()
Run Code Online (Sandbox Code Playgroud)

tim*_*geb 7

你可以用for/ elseloop循环你的方法函数.

else子句仅forbreak语句未终止时运行.

approaches = ((first_approach, [arg1, arg2, ...], {'kwarg1':kwarg1, 'kwarg2':kwarg2, ...}, (Approach1Exception1, Approach1Exception2, ...)),
              (second_approach, ..., ..., ...),
              (third_approach, ..., ..., ...), 
              ...)

for approach, args, kwargs, exceptions in approaches:
    try:
        approach(*args, **kwargs)
        break
    except exceptions: 
        pass
else:
    give_up()
Run Code Online (Sandbox Code Playgroud)