¿Por qué las excepciones de Python se denominan "Error"?

82

¿Por qué son excepciones Python denominan "error" (por ejemplo ZeroDivisionError, NameError, TypeError) y no "excepción" (por ejemplo ZeroDivisionException, NameException, TypeException).

Vengo de una experiencia en Java y comencé a aprender Python recientemente, como tal, esto es confuso porque en Java hay una distinción entre errores y excepciones.

¿Hay alguna diferencia en Python también o no?

Elena
fuente

Respuestas:

95
  1. No nombra cada clase con 'Clase' en el nombre y cada variable con '_variable' en el nombre. De la misma manera que no nombra la excepción usando la palabra 'Excepción'. Un nombre debe decir algo sobre el significado de un objeto. "Error" es el significado de la mayoría de las excepciones.

  2. No todas las excepciones son errores. SystemExit, KeyboardInterrupt, StopIteration, GeneratorExitSon todas las excepciones y no errores. La palabra "Error" en los errores reales muestra la diferencia.

  3. "Error" es más corto que "Excepción". Eso puede ahorrar algunos caracteres en el ancho del código sin pérdida de significado. Eso hace alguna diferencia.

Jacek Konieczny
fuente
2
No todas las excepciones son errores : de hecho, hay una serie de excepciones que se derivan de una clase de excepción denominada Warning. Por favor vea mi respuesta .
DavidRR
1
Esta es una gran visualización docs.python.org/2/library/exceptions.html#exception-hierarchy
Jason Capriotti
1
La visualización actualizada para Python3 está aquí: docs.python.org/3.6/library/exceptions.html#exception-hierarchy
Sebastian Jylanki
49

Creo que esta convención proviene de PEP 8 - Guía de estilo para código Python :

Nombres de excepción

Debido a que las excepciones deben ser clases, aquí se aplica la convención de nomenclatura de clases. Sin embargo, debe utilizar el sufijo "Error" en los nombres de sus excepciones (si la excepción en realidad es un error).

daotoad
fuente
8

Python es bastante similar a Java a este respecto. Pero la excepción de Python debería compararse con Throwable de Java.

Como los Throwables vienen en todo tipo de sabores: Error, RuntimeException y Exception (marcada), también lo hacen Python (aunque no hay excepciones marcadas).

En cuanto al lenguaje, un Error es excepcional, por lo que la jerarquía de herencia no es extraña.

Sin embargo, no me gusta particularmente el nombre Exception. Las excepciones no solo se utilizan para circunstancias excepcionales (como con suerte Errores) sino también para salir del flujo de control. Porque eso es lo que hace una excepción; salta del flujo normal de control a un punto marcado. Un poco como un goto, pero más refinado.

Dicho esto, cada vez que tiene una situación en la que no se puede encontrar un valor de retorno adecuado, tiende a usar una excepción. Tanto en Python como en Java.

extraneón
fuente
-1; No creo que esto ofrezca ninguna información útil. Hablas de 'circunstancias excepcionales' sin definirlas claramente, das una descripción de cómo funcionan las excepciones ("salta del flujo normal de control a un punto marcado") que no es realmente precisa, invocas la distinción entre Error y RuntimeException en Java como si existiera alguna distinción similar en Python (no es así), y nunca aborda la pregunta de por qué las excepciones de Python a menudo tienen Erroren su nombre.
Mark Amery
4

P. ¿Por qué las excepciones de Python se denominan "Error"?

Supongo que esto se debe a que la mayoría de las excepciones de Python se clasifican como errores o advertencias . Si los nombres de las excepciones de Python terminaran con Exception, esta distinción no sería posible.

Algunos ejemplos de advertencias son DeprecationWarningy ImportWarning.

Por favor, vea la jerarquía de clases de la 2.x para las excepciones internas , así como que para 3.x .

DavidRR
fuente
3

Simplemente pon:

  • Las excepciones de Python NO se denominan "Error".
  • Los errores de Python se denominan "Error".
  • Los errores de Python se pueden generar, detectar y manejar como excepciones.
  • Algo que comienza como un error puede terminar siendo una excepción manejada que no genera un mensaje de error.
  • También Exceptionse puede subir directamente

Concepto:

Normalmente hago esto, pero voy a hacer una excepción.

O

Esto normalmente sería un error, pero vamos a hacer una excepción, detectarlo y realizar algún procedimiento.

Detalles:

Excepciones vs errores:

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

Los errores detectados durante la ejecución se denominan excepciones y no son incondicionalmente fatales.

Flujo de trabajo:

  • El programa monitorea los errores.
  • Si ocurre un error pero el programa NO lo detecta durante la ejecución, se genera un mensaje de error.
  • Si ocurre un error y es detectado por el programa durante la ejecución, es una excepción.
  • El programa puede manejar las excepciones. Pueden manejarse con elegancia o dar como resultado un mensaje de error.
  • Las excepciones que NO son manejadas por el programa son excepciones no manejadas ( no capturadas ) y se convierten en mensajes de error.
Javier
fuente
1

Es solo nombrar. En Java, se java.lang.Errordiferencia de otros Throwablemensajes de correo electrónico porque esos tipos de errores deben desmarcarse. En Python, todas las excepciones están desmarcadas, por lo que la distinción no tiene sentido.

gustafc
fuente
La clase base se llama Exception (vea mi comentario sobre la otra respuesta), así que ¿por qué no nombrar a los niños Exception también?
Elena
@Elena: Porque entonces finalmente terminarías con algo así class ExceptionHandlingException extends RuntimeExceptiony eso es horrible de leer.
Esko
2
Aparte de otras razones publicadas por otros, tenga en cuenta que el nombre en la biblioteca estándar de Python no siempre es consistente.
gustafc