我正在尝试学习Python的细节,我遇到了the try-else statement。
try1_stmt ::= "try" ":" suite
("except" [expression [("as" | ",") target]] ":" suite)+
["else" ":" suite]
["finally" ":" suite]
如果控制流出try子句的末尾,则执行可选的else子句。 else子句中的异常不由前面的except子句处理。
我想不出这会有用的情况。通常,将代码放在try
块的末尾或else
块中没有实际区别。
else
条款的优点是什么?它是否用在一些真实世界的代码中?
答案 0 :(得分:9)
通常在将代码放入之间没有实际区别 try块的结尾或else块。
else子句有什么用处?
else子句本身很有趣。它在没有异常但在finally子句之前运行。这是一个没有合理替代方案的用例。
如果没有else子句,在完成之前运行其他代码的唯一选择就是将代码添加到try-clause中的笨拙做法。这很笨拙,因为它有风险 在代码中引发异常,而这些异常并不是由try-block保护的。
在最终确定之前运行其他未受保护的代码的用例不会经常出现。因此,不要期望在已发布的代码中看到许多示例。这有点罕见。
else子句的另一个用例是它执行必须在没有异常发生时发生的动作,并且在处理异常时不会发生。例如:
recip = float('Inf')
try:
recip = 1 / f(x)
except ZeroDivisionError:
logging.info('Infinite result')
else:
logging.info('Finite result')
最后,try-block中最常用的else子句是为了进行一些美化(在同一级别的缩进中调整异常结果和非异常结果)。此用法始终是可选的,并非绝对必要。
是否在某些现实世界的代码中使用了它?
是的,标准库中有很多例子。
答案 1 :(得分:4)
在try块的末尾有'额外'的东西,至少在我看来,有点代码味道。 try块应该只包含您认为有抛出异常风险的行,最好只包含一行。
这可以避免任何意外从不怀疑可能抛出的行中捕获异常的情况(并且可能不适当地处理它)。 else
块允许您以更清晰的方式对其进行编码。