繁体   English   中英

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

[英]Why is it recommended to derive from Exception instead of BaseException class in Python?

Python 2文档说“鼓励程序员从Exception类或其子类之一派生新的异常,而不是从BaseException派生”。 没有任何进一步解释为什么。

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

>>> dir(BaseException) == dir(Exception)
True

BaseException派生的异常是: GeneratorExitKeyboardInterruptSystemExit

根据文件:

  • 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: ... 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM