为什么将Python异常命名为“错误”?


82

为什么Python的异常命名为“错误”(例如ZeroDivisionErrorNameErrorTypeError),而不是“例外”(例如ZeroDivisionExceptionNameExceptionTypeException)。

我来自Java背景,最近开始学习Python,这令人困惑,因为在Java中错误与异常之间是有区别的。

Python也有区别吗?

Answers:


95
  1. 您不会将每个类的名称命名为“ Class”,也不会将每个变量的名称命名为“ _variable”。以相同的方式,您不会使用单词“ Exception”来命名异常。名称应说明对象的含义。“错误”是大多数例外的含义。

  2. 并非所有的异常都是错误。SystemExitKeyboardInterruptStopIterationGeneratorExit都是例外,而不是错误。实际错误中的“错误”一词表明了差异。

  3. “错误”比“异常”短。这样可以节省代码宽度中的几个字符,而不会造成任何意义上的损失。这有所不同。


2
并非所有的异常都是错误:确实,有许多异常是从名为的异常类派生的Warning。请看我的回答
DavidRR


1
有关Python3的最新可视化信息,请访问:docs.python.org/3.6/library/exceptions.html#exception-hierarchy
Sebastian Jylanki

49

我相信此约定来自PEP 8-Python代码样式指南

异常名称

因为异常应该是类,所以在这里适用类命名约定。但是,您应该在异常名称上使用后缀“ Error”(如果异常实际上是一个错误)。


8

在这方面,Python非常类似于Java。但是应该将Python的Exception与Java的Throwable进行比较。

由于Throwables具有各种形式-错误,RuntimeException和(检查的)异常-Python的也是如此(尽管没有检查的异常)。

至于语言,错误是例外,因此继承层次结构并不奇怪。

我不太喜欢Exception这个名字。异常不仅用于特殊情况(如希望的错误),而且还用于脱离控制流程。因为那是异常的作用;它跳出正常的控制流程,到达标记点。有点像goto,但更加精致。

就是说,每次遇到找不到合适的返回值的情况时,您都倾向于使用Exception。两者都在Python和Java中一样。


-1; 我觉得这没有提供任何有用的见解。您在谈论“例外情况”时没有明确定义它们,而是描述了例外情况的工作原理(“从正常的控制流中跳到标记点”)不是很准确,您将错误与Java中的RuntimeException好像Python中存在类似的区别(实际上不存在),并且您从未真正解决过为什么Python异常经常Error以它们的名字命名的问题。
Mark Amery 2015年


3

简单的说:

  • Python异常未命名为“错误”。
  • Python错误称为“错误”。
  • Python错误可以引发,捕获和处理为异常。
  • 始于错误的事物最终可能成为已处理的异常,不会导致出现错误消息。
  • 一个Exception也可以直接提出

概念:

我通常会做这件事,但我要作一个例外

要么

通常这将是一个错误,但是我们将创建一个异常,将其捕获并执行一些过程。

细节:

异常与错误:

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

执行期间检测到的错误称为异常,并且不是无条件致命的

工作流程:

  • 该程序监视错误。
  • 如果发生错误,但是程序在执行过程中未检测到错误,则会导致错误消息。
  • 如果在执行过程中发生错误并被程序检测到,则为异常。
  • 异常可以由程序处理。可以妥善处理它们或导致错误消息。
  • 程序未处理的异常是未处理的未捕获的)异常,并成为错误消息。

1

这只是命名。在Java中,您java.lang.Error与其他人有区别,Throwable因为这些类型的错误需要取消检查。在Python中,所有异常均未选中,因此区别是毫无意义的。


基类称为Exception(请参见我对其他答案的评论),为什么不也为子类命名Exception?
Elena 2010年

@Elena:因为那样的话,您最终会得到类似的东西class ExceptionHandlingException extends RuntimeException,这简直太可怕了。
艾斯科(Esko)2010年

2
除了其他人发布的其他原因外,请记住,Python标准库中的命名并不总是一致的。
gustafc 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.