为什么GeneratorExit和StopIteration有不同的基类?

时间:2015-07-14 12:31:22

标签: python exception exception-handling python-internals

我正在查看内置python异常的层次结构,我注意到StopIterationGeneratorExit有不同的基类:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
      +-- Warning

或代码:

>>> GeneratorExit.__bases__
(<type 'exceptions.BaseException'>,)
>>> StopIteration.__bases__
(<type 'exceptions.Exception'>,)

当我转到每个例外的具体描述时,我可以阅读以下内容:

https://docs.python.org/2/library/exceptions.html#exceptions.GeneratorExit

  

异常GeneratorExit

     

调用生成器的close()方法时引发。它直接继承自BaseException而不是StandardError,因为从技术上讲它不是错误。

https://docs.python.org/2/library/exceptions.html#exceptions.StopIteration

  

异常StopIteration

     

由迭代器的next()方法引发,表示没有其他值。这是从Exception而不是StandardError派生的,因为在其正常应用程序中这不被视为错误。

对我来说这不是很清楚。两者在它们不通知错误的意义上是相似的,而是用于改变代码流的“事件”。所以,它们在技术上不是错误,我理解它们应该与其他异常分开......但为什么一个是BaseException的子类而另一个是Exception的子类?

总的来说,我一直认为Exception子类是错误的,当我写盲try: except:(例如调用第三方代码)时,我总是试图捕捉Exception,但是也许那是错的,我应该抓住StandardError

0 个答案:

没有答案