Python中的try-else有什么用?
我正在学习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 个回答
如果将来有读者看到这篇帖子,想要另一个例子;我这里有一个。在我的论文中,我写了以下的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
在我看来,try块最后加一些“额外”的内容有点像代码的坏味道。try块里应该只放那些你认为可能会出错的代码行,最好就一行。
这样可以避免意外捕捉到你没有预料到的错误(而且可能处理得不太合适)。使用else
块可以让你的代码看起来更整洁。
通常,把代码放在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块中最常见的用法是为了美观(把异常结果和非异常结果对齐到同一缩进级别)。这个用法是可选的,并不是绝对必要的。
在一些实际的代码中有用到吗?
有的,标准库中有不少这样的例子。