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

Joh*_*ohn 10 python exception-handling

在Python中,try语句支持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()
Run Code Online (Sandbox Code Playgroud)

为什么需要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)
Run Code Online (Sandbox Code Playgroud)

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

Len*_*bro 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)
Run Code Online (Sandbox Code Playgroud)

在这种情况下f.read()f.close()在这种情况下的错误将给你日志消息"Unable to open 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()
Run Code Online (Sandbox Code Playgroud)

并且读取或关闭时的错误不会导致日志写入,但错误将在调用堆栈中向上无法捕获.

  • @John:因为它们不如Python好?:-) (10认同)