Python 2 documentation表示“鼓励程序员从Exception类或其子类之一派生新的异常,而不是从BaseException派生”。没有任何进一步解释为什么。
我很好奇为什么这样推荐?它只是保留了Python开发人员设想的exceptions hierarchy吗?
>>> dir(BaseException) == dir(Exception)
True
答案 0 :(得分:10)
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
除外)
更新:
PEP 352 - Required Superclass for Exceptions解释了原因。
现在,异常层次结构更加重要,因为它有一个 基本根,需要对现有层次结构进行更改。就这样 现在站起来,如果想要捕获所有发出错误信号的异常 并且并不意味着应该允许口译员退出 在except子句中指定除了两个例外以外的所有例外 分别抓住两个例外,然后重新提升它们 所有其他异常都属于一个裸的except子句:
except (KeyboardInterrupt, SystemExit): raise except: ...
这是不必要的明确。该PEP提议移动 KeyboardInterrupt和SystemExit直接从中继承 BaseException。