我正在查看内置python异常的层次结构,我注意到StopIteration
和GeneratorExit
有不同的基类:
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
。