什么是尝试 - 在Python中有好处?

时间:2011-11-15 01:13:26

标签: python try-catch

我正在尝试学习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条款的优点是什么?它是否用在一些真实世界的代码中?

2 个答案:

答案 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块允许您以更清晰的方式对其进行编码。