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

时间:2015-01-17 01:01:14

标签: python exception

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

我很好奇为什么这样推荐?它只是保留了Python开发人员设想的exceptions hierarchy吗?

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

1 个答案:

答案 0 :(得分:10)

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 - Required Superclass for Exceptions解释了原因。

  

现在,异常层次结构更加重要,因为它有一个   基本根,需要对现有层次结构进行更改。就这样   现在站起来,如果想要捕获所有发出错误信号的异常   并且并不意味着应该允许口译员退出   在except子句中指定除了两个例外以外的所有例外   分别抓住两个例外,然后重新提升它们   所有其他异常都属于一个裸的except子句:

except (KeyboardInterrupt, SystemExit):
    raise
except:
    ...
     

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