我想在同一个任务中尝试许多不同的方法,每次方法失败时捕获异常.我知道如果尝试失败将引发的异常(并且每次尝试可能会有所不同).在最后一次尝试之后,我想优雅地放弃并继续前进.
我目前通过嵌套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)
你可以用for/ elseloop循环你的方法函数.
该else子句仅for在break语句未终止时运行.
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)
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |