try...except...else 与嵌套 try...except 的比较
接着说:
try:
f = open('foo', 'r')
except IOError as e:
error_log.write('Unable to open foo : %s\n' % e)
else:
data = f.read()
f.close()
我想到一个问题,使用else子句
解决的特殊情况,是否可以通过使用嵌套的try...except
来避免,从而不需要else
呢?
try:
f = open('foo', 'r')
try:
data = f.read()
f.close()
except:
pass
except IOError as e:
error_log.write('Unable to open foo : %s\n' % e)
2 个回答
0
其实,这并不是总需要的,你可以简单地这样做:
f = None
try:
f = open('foo', 'r')
except IOError:
error_log.write('Unable to open foo\n')
if f:
data = f.read()
f.close()
6
try..except..else
可能不是 必须 的,但用起来会很不错。在我看来,这种 try..except..else
的写法特别好。
只是因为你可以不用某种语法,并不代表它就没用。比如,装饰器的语法就是一种语法糖(我觉得这是最明显的例子),for
循环其实就是升级版的 while
循环等等。try..except..else
有它合适的用处,我觉得这里就是一个很好的例子。
而且,这两段代码并不是等价的。如果 f.read()
出现了异常(比如磁盘读取错误、文件内部数据损坏或其他类似问题),第一段代码会正常抛出异常,但第二段代码会忽略这个异常,认为一切都正常。对我来说,我更喜欢下面这种写法,它更简洁,也更容易理解:
try:
with open('foo', 'r') as f:
data = f.read()
except IOError as e:
error_log.write('Unable to open foo : %s\n' % e)
(这假设你想捕捉 file.read
和 file.close
中的错误。我实在想不出为什么你不想这样做。)