为什么在Python的try语句中需要else子句?

11 投票
4 回答
1737 浏览
提问于 2025-04-16 10:50

在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()

如果在读取或关闭时出错,就不会写入日志,但错误会在调用堆栈中向上抛出,未被捕获。

撰写回答