为什么Python的异常被命名为"Error"?

87
为什么Python的异常被命名为“Error”(例如ZeroDivisionErrorNameErrorTypeError),而不是“Exception”(例如ZeroDivisionExceptionNameExceptionTypeException)?
我来自Java背景,并最近开始学习Python,因此这很令人困惑,因为在Java中有错误和异常之间的区别。
在Python中是否也有区别?
6个回答

105
  1. 你不需要在类名中加上“Class”,也不需要在变量名中加上“_variable”。就像你不会使用“Exception”这个词命名异常一样。名称应该反映对象的含义,“错误”是大多数异常的含义。

  2. 并非所有异常都是错误。SystemExit,KeyboardInterrupt,StopIteration和GeneratorExit都是异常,而不是错误。实际错误中的“错误”表明了差异。

  3. “错误”比“异常”更短。那可以节省代码宽度中的几个字符,而不会丢失任何含义。这会带来一些差异。


3
并非所有异常都是错误:实际上,有许多异常是从名为“警告(Warning)”的异常类派生的。请参见我的答案 - DavidRR
2
这是一个很棒的可视化 https://docs.python.org/2/library/exceptions.html#exception-hierarchy - Jason Capriotti
1
Python3的最新可视化在这里:https://docs.python.org/3.6/library/exceptions.html#exception-hierarchy - user4157482

55

我认为这个惯例来自于PEP 8 - Python代码风格指南

异常名称

由于异常应该是类,因此这里适用类命名约定。但是,如果异常确实是一个错误,您应该在异常名称上使用后缀“Error”。


10

Python在这方面与Java非常相似。但是,Python的异常应该与Java的Throwable进行比较。

就像Throwables有各种各样的类型 - 错误(Error)、运行时异常(RuntimeException)和(已检查的)异常(Exception)一样,Python也有它们(尽管没有已检查的异常)。

至于语言本身,错误是特殊的,因此继承层次结构并不奇怪。

我并不特别喜欢“异常”这个名称。异常不仅用于异常情况(就像希望出现错误一样),而且还用于跳出控制流程。因为这就是异常所做的;它跳出正常的控制流程到一个标记点。有点像goto,但更精细。

话虽如此,每当您遇到无法找到合适的返回值的情况时,您倾向于使用异常。无论是在Python中还是在Java中都是如此。


-1;我觉得这并没有提供任何有用的见解。你谈论“特殊情况”,却没有清晰地定义它们,你描述了异常如何工作(“跳出正常控制流到一个标记点”),但这并不准确,你引用了Java中Error和RuntimeException之间的区别,好像Python中存在类似的区别(实际上并不存在),而且你从未真正回答为什么Python的异常经常在它们的名称中带有“Error”。 - Mark Amery

7
问:为什么Python异常被命名为“Error”?
我猜这是因为大多数 Python异常被归类为错误警告。如果Python异常的名称以Exception结尾,这种区分将不可能实现。
警告的例子包括DeprecationWarningImportWarning
请参见内置异常的2.x类层次结构以及3.x的类层次结构

2
简单来说:
  • Python异常不被命名为“Error”。
  • Python错误被命名为“Error”。
  • Python错误可以作为异常被引发、捕获和处理。
  • 最初作为错误的事情可能最终成为一个被处理的异常,不会产生错误信息。
  • 也可以直接引发异常。
概念:

通常我会这样做,但我会例外处理

或者

这通常会导致错误,但我们将进行异常处理,并执行某些过程。

细节:

异常与错误:

https://docs.python.org/2/tutorial/errors.html

在执行过程中检测到的错误被称为“异常”,并不是无条件致命的。
工作流程:
- 程序监视错误。 - 如果程序在执行过程中发生错误但未被检测到,则会导致错误消息。 - 如果程序在执行过程中发生错误并被检测到,则为异常。 - 异常可以由程序处理。它们可以得到优雅的处理或导致错误消息。 - 未被程序处理的异常是“未处理”(“未捕获”)异常,并变成错误消息。

1

其实只是命名的不同。在Java中,你有java.lang.Error与其他Throwable不同,因为这些类型的错误需要是未经检查的。在Python中,所有的异常都是未经检查的,所以这种区别有点无意义。


基类被称为Exception(请参见我对其他答案的评论),那么为什么不将子类也命名为Exception呢? - Elena
@Elena:因为你最终会得到像class ExceptionHandlingException extends RuntimeException这样的东西,那真的太难读了。 - Esko
2
除了其他人发布的原因外,请记住Python标准库中的命名并不总是一致的。 - gustafc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接