关于异常处理:为什么python中的try语句需要else子句?

Why is else clause needed for try statement in python?

本问题已经有最佳答案,请猛点这里访问。

在python中,try语句支持else子句,该子句在try块中的代码不引发异常时执行。例如:

1
2
3
4
5
6
7
8
try:
  f = open('foo', 'r')
except IOError as e:
  error_log.write('Unable to open foo : %s
'
% e)
else:
  data = f.read()
  f.close()

为什么需要else子句?我们不能把上面的代码写下来吗?

1
2
3
4
5
6
7
try:
  f = open('foo', 'r')
  data = f.read()
  f.close()
except IOError as e:
  error_log.write('Unable to open foo : %s
'
% e)

如果open不引发异常,执行是否会继续执行data = f.read()


不同的是,如果在f.read()或f.close()代码中出现错误,会发生什么。在这种情况下:

1
2
3
4
5
6
7
try:
  f = open('foo', 'r')
  data = f.read()
  f.close()
except IOError as e:
  error_log.write('Unable to open foo : %s
'
% e)

在这种情况下,f.read()f.close()中的错误会给您提供日志消息"Unable to open foo",这显然是错误的。

在这种情况下,可以避免:

1
2
3
4
5
6
7
8
try:
  f = open('foo', 'r')
except IOError as e:
  error_log.write('Unable to open foo : %s
'
% e)
else:
  data = f.read()
  f.close()

读取或关闭时出错不会导致日志写入,但错误会在调用堆栈中不匹配地向上增加。


else用于在try子句没有引发异常时必须执行的代码。

使用else比附加的try子句更好,因为else避免意外捕获不由try except语句保护的代码引发的异常。


据我所知,else子句将try块的范围限制为您试图管理异常的代码。或者,您的try块更大,您可能会捕获不打算捕获的异常。


@约翰:我认为像Java这样的语言,或者其他语言,你有不同的例外。例如,像fileNotFound异常(或者类似的情况,我不确定名称)。这样,您就可以处理不同的异常并相应地采取行动。然后您就知道为什么会发生错误了,因为打开或关闭了。