怎么理解 Python 文档中的这句话

"The use of the else clause is better than adding additional code to the try clause because it avoids accidentally catching an exception that wasn’t raised by the code being protected by the try ... except statement."
https://docs.python.org/3/tutorial/errors.html
看了半天没琢磨明白用 else 相比直接写到 try 里有什么好处
补充:"wasn’t raised by the code ..." 具体指什么情况? 举个例子?

阅读 3.4k
3 个回答

如果用 try ... except 很可能会捕获到自己不想要的类型的异常,或自己不期望的函数抛出的异常。
比如这样的代码:

try:
    f = open(...)
    # 在此期间又做了点别的
    f.close()
except OSError:
    ...

OSError 可能有自己不期待的异常类型,或者不是文件操作引起的异常。
如果在 except 中处理不当,就会导致对应的异常没有得到正确处理,引起 bug。

try:
  # 我们想要的数据在 alist 中
  data = alist[0]
except IndexError:
  # ...但那数据也许并不存在
  data = []
else:
  # 取得了数据,存放在 datalist 的第一位置,取代之前的旧数据
  # 我知道之前一定是有旧数据的,否则这程序有 bug
  datalist[0] = data

随便写的,表达一下意思而已。

因为有些代码是不论异常有没有发生都要执行的。就和例子里的一样,不论文件是否打开,文件流都必须关闭,不然有可能发生后续访问的时候文件被占用这种很恶心的事情。而且你在捕获不同的异常的时候要是疯狂复制相同的善后代码的话,是违反DRY定理的。更重要的是,就算你没有写对应异常的catch块,else也会被执行,保证了安全性

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题