有没有一种更干净或更像Python的方法来完成以下工作?在
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.")
基本上是:如果尝试1失败,尝试2。如果#2失败,请尝试#3。如果#3失败,请尝试#4。如果#4失败。。。如果#n失败,则最终引发一些异常。在
请注意,我不一定每次都调用同一个函数,也不一定每次都使用相同的函数参数。但是,我是,期望每个函数上都有相同的异常MyError
。在
基于生成器的方法可能会比数据驱动方法提供更多的灵活性:
这个想法是构建一个生成器,通过一个重试循环逐步通过尝试块。在
一旦生成器成功地尝试了一次,它就会用一个硬的
return
停止自己的迭代。不成功的尝试会导致下一次回退的重试循环。否则,如果它用尽了尝试,它最终会抛出一个无法恢复的错误。在这里的优点是try..exceptions的内容可以是您想要的任何内容,而不仅仅是单个函数调用,如果这是由于任何原因而特别尴尬的话。生成器函数也可以在闭包中定义。在
正如我在这里所做的,产量也可以传递回日志信息。在
上面的输出,顺便说一句,我让尝试2成功了,如前所述:
^{pr2}$如果您在尝试2中取消了对加薪的注释,那么它们都失败了,您将得到:
编辑:
根据您的伪代码,如下所示:
它会让任何例外,但我的错误泡沫,并停止整个事情。您还可以选择为每个块捕获不同的错误。在
多亏了johnkugelman的文章here,我决定采用这个方法,它利用for循环中不太为人所知的
else
子句来执行代码,当一个完整的列表被耗尽而没有break
时。在正如danielroseman在下面评论的那样,注意缩进,因为
try
语句也有一个else
子句。在相关问题 更多 >
编程相关推荐