为什么建议在Python中派生Exception而不是BaseException类?

gol*_*lem 8 python exception

Python 2里的文件说:"我们鼓励程序员从BaseException获得从Exception类或新的例外它的一个子类,而不是".没有任何进一步解释为什么.

我很好奇为什么这样推荐?它只是保留异常层次结构,因为Python开发人员设想它?

>>> dir(BaseException) == dir(Exception)
True
Run Code Online (Sandbox Code Playgroud)

fal*_*tru 11

源自例外BaseException是:GeneratorExit,KeyboardInterrupt,SystemExit.

根据文件:

  • GeneratorExit:调用生成器的close()方法时引发.它直接继承自BaseException而不是StandardError,因为它在技术上不是错误.
  • KeyboardInterrupt:当用户按下中断键(通常为Control-C或Delete)时触发.在执行期间,定期检查中断.当内置函数input()或raw_input()等待输入时输入的中断也会引发此异常.该异常继承自BaseException,以免被捕获Exception的代码意外捕获,从而阻止解释器退出.
  • SystemExit:异常继承自BaseException而不是StandardError或Exception,因此不会被捕获Exception的代码意外捕获.这允许异常正确传播并导致解释器退出.

所以通常的原因是防止try ... except Exception意外地阻止口译员退出(除外GeneratorExit)

在看到Ashwini Chaudhary的评论后更新:

PEP 352 - 例外所需的超类解释了原因.

由于异常层次结构具有基本根,因此现在更加重要,因此需要对现有层次结构进行更改.按照现在的情况,如果想要捕获所有发出错误信号的异常并且并不意味着应该允许解释器退出,则必须在except子句中指定除两个异常之外的所有异常,或者分别捕获两个异常,然后重新提出它们并将所有其他例外都归结为一个裸的除外条款:

except (KeyboardInterrupt, SystemExit):
    raise
except:
    ...
Run Code Online (Sandbox Code Playgroud)

这是不必要的明确.此PEP建议移动KeyboardInterrupt和SystemExit直接从BaseException继承.