为什么在Python的try语句中需要else子句?
在Python中,try语句可以有一个else部分,这个else部分会在try块里的代码没有出现错误时执行。举个例子:
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:
f = open('foo', 'r')
data = f.read()
f.close()
except IOError as e:
error_log.write('Unable to open foo : %s\n' % e)
如果open没有出错,执行不是会继续到data = f.read()
吗?
4 个回答
3
else
是用来处理那些在 try
代码块没有出现错误时,一定要执行的代码。
使用 else
比再加一个 try
代码块要好,因为 else
可以避免意外捕捉到那些并不是由 try except
语句保护的代码引发的错误。
3
根据我的理解,else
这个部分是用来限制尝试块的范围,也就是你想要处理异常的那段代码。否则,如果你的 try
块写得太大,就可能会捕捉到一些你并不想处理的异常。
14
这里的区别在于,如果你在 f.read()
或 f.close()
这段代码中遇到错误,会发生什么。在这种情况下:
try:
f = open('foo', 'r')
data = f.read()
f.close()
except IOError as e:
error_log.write('Unable to open foo : %s\n' % e)
如果在 f.read()
或 f.close()
出现错误,你会看到日志信息 "无法打开 foo"
,这显然是不对的。
而在这种情况下,可以避免这种情况:
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()
如果在读取或关闭时出错,就不会写入日志,但错误会在调用堆栈中向上抛出,未被捕获。