在try / except块中创建变量是否被视为不良做法?

阿图尔

让我们考虑这个示例代码,该代码返回None列表中第一个值的索引li(如果存在),或者如果None不存在则返回最后一个元素的索引li

我可能会检查“无”在列表中,但使用ifs不是首选方法-Dive Into Python鼓励使用异常,因为据说异常会更快并且使代码更干净(请参阅问题)。因此,我采用了三种方法:

1。

try:
    my_index = li.index(None)
except ValueError:
    my_index = len(li) - 1

print my_index

my_index在try / except块中声明。行数少,没有多余的声明。可能的问题-不同的异常类型将导致无法在上创建my_index脚本并使其崩溃print

2。

my_index = None  # or anything else
try:
    my_index = li.index(None)
except ValueError:
    my_index = len(li) - 1

print my_index

my_index在try / except之前声明,并且分配了一个值,无论发生什么异常。缺点-多行,看起来多余。

3. 编辑:将不起作用-无论try / except结果如何,最终都会执行

try:
    my_index = li.index(None)
except ValueError:
    my_index = len(li) - 1
finally:
    my_index = None  # or anything else

print my_index

优点-始终有效(或者至少我认为如此)。缺点-我从未见过有人使用finally我的整个Python体验,这一定是有原因的。

这些方法中的哪一种被认为是首选和Python方式?也许有更好的解决方案?

降低
try:
    my_index = li.index(None)
except ValueError:
    my_index = len(li) - 1

print my_index

可能的问题-不同的异常类型将导致无法在上创建my_index脚本并使其崩溃print

嗯不 如果引发了其他任何异常,则该整个代码块都将中止,因为异常会冒泡直到调用者。因此,如果ValueError引发任何其他异常类型print则将永远不会执行。这是一个相当理智的行为:您处理期望的错误并可以处理,并且让其他错误导致整个块(可能是整个脚本)中止。这是您想要的最简洁的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章