try...except...else 与嵌套 try...except 的比较

3 投票
2 回答
1081 浏览
提问于 2025-04-16 21:09

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

接着说:

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.readfile.close 中的错误。我实在想不出为什么你不想这样做。)

撰写回答