Python中的try-else有什么用?

9 投票
3 回答
3084 浏览
提问于 2025-04-17 06:19

我正在学习Python的一些细节,碰到了try-else语句

try1_stmt ::=  "try" ":" suite
               ("except" [expression [("as" | ",") target]] ":" suite)+
               ["else" ":" suite]
               ["finally" ":" suite]

可选的else部分会在try部分的代码执行完毕后运行。如果else部分出现了错误,前面的except部分是不会处理这些错误的。

我想不出有什么情况下这个else会有用。通常,把代码放在try块的最后和放在else块里没有什么实际区别。

那这个else部分有什么用呢?在实际的代码中会用到吗?

3 个回答

0

如果将来有读者看到这篇帖子,想要另一个例子;我这里有一个。在我的论文中,我写了以下的try-except-else-finally语句。

我正在进行很多数值模拟。每次模拟我都会用pickle来保存。这些模拟是在一个高性能计算集群(HPC)上进行的。不知道为什么,最近有一些pickle文件变得损坏了。我不想保存这些文件,而是想把它们删除。

for i range(n_simulations):
   data = simulate()

   # Save simulation data using my custom method
   filepath = save_to_pickle(data)
 
   # Custom class to reload my pickles during data processing later
   data_loader = DataLoad()
   
   # Checking if file is corrupted using the same data loader class
   try:
        data_loader.load_file(filepath)

   except Badzipfile:
       print('File is corrupted, deleting')
       delete_saved_file(filepath)

   else:
       print('Simulation success') 

   finally:
       del data_loader
4

在我看来,try块最后加一些“额外”的内容有点像代码的坏味道。try块里应该只放那些你认为可能会出错的代码行,最好就一行。

这样可以避免意外捕捉到你没有预料到的错误(而且可能处理得不太合适)。使用else块可以让你的代码看起来更整洁。

9

通常,把代码放在try块的末尾和放在else块里没有实际区别。

那else块有什么用呢?

else块本身是很有意思的。它在没有异常发生时运行,但会在finally块之前执行。这是它唯一的用途,没有其他合理的替代方法。

如果没有else块,想要在最终处理之前运行额外的代码,唯一的选择就是把代码放在try块里。这种做法不太好,因为这样可能会在本来不想保护的代码中引发异常。

在最终处理之前运行额外的、不受保护的代码的情况并不常见。所以,不要期待在发布的代码中看到很多这样的例子。这种情况比较少见。

else块的另一个用途是执行那些在没有异常发生时必须进行的操作,而在处理异常时则不执行的操作。例如:

   recip = float('Inf')
   try:
       recip = 1 / f(x)
   except ZeroDivisionError:
       logging.info('Infinite result')
   else:
       logging.info('Finite result')

最后,else块在try块中最常见的用法是为了美观(把异常结果和非异常结果对齐到同一缩进级别)。这个用法是可选的,并不是绝对必要的。

在一些实际的代码中有用到吗?

有的,标准库中有不少这样的例子。

撰写回答