Python: manejo de excepciones

Python proporciona dos características muy importantes para manejar cualquier error inesperado en sus programas de Python y para agregar capacidades de depuración en ellos:

  • Exception Handling- Esto se trataría en este tutorial. Aquí hay una lista de Excepciones estándar disponibles en Python: Excepciones estándar .

  • Assertions- Esto se trataría en el tutorial de afirmaciones en Python .

Lista de excepciones estándar -

No Señor. Nombre y descripción de la excepción
1

Exception

Clase base para todas las excepciones

2

StopIteration

Se genera cuando el método next () de un iterador no apunta a ningún objeto.

3

SystemExit

Generado por la función sys.exit ().

4

StandardError

Clase base para todas las excepciones integradas excepto StopIteration y SystemSalir.

5

ArithmeticError

Clase base para todos los errores que ocurren para el cálculo numérico.

6

OverflowError

Se genera cuando un cálculo excede el límite máximo para un tipo numérico.

7

FloatingPointError

Se genera cuando falla un cálculo de punto flotante.

8

ZeroDivisionError

Se genera cuando se realiza una división o módulo por cero para todos los tipos numéricos.

9

AssertionError

Se genera en caso de falla de la declaración Assert.

10

AttributeError

Se genera en caso de falla de referencia o asignación de atributo.

11

EOFError

Se genera cuando no hay entrada de la función raw_input () o input () y se alcanza el final del archivo.

12

ImportError

Se genera cuando falla una declaración de importación.

13

KeyboardInterrupt

Se genera cuando el usuario interrumpe la ejecución del programa, generalmente presionando Ctrl + c.

14

LookupError

Clase base para todos los errores de búsqueda.

15

IndexError

Se genera cuando no se encuentra un índice en una secuencia.

dieciséis

KeyError

Se genera cuando la clave especificada no se encuentra en el diccionario.

17

NameError

Se genera cuando no se encuentra un identificador en el espacio de nombres local o global.

18

UnboundLocalError

Se genera cuando se intenta acceder a una variable local en una función o método, pero no se le ha asignado ningún valor.

19

EnvironmentError

Clase base para todas las excepciones que ocurren fuera del entorno de Python.

20

IOError

Se genera cuando falla una operación de entrada / salida, como la declaración de impresión o la función open () al intentar abrir un archivo que no existe.

21

IOError

Criado por errores relacionados con el sistema operativo.

22

SyntaxError

Se genera cuando hay un error en la sintaxis de Python.

23

IndentationError

Se eleva cuando la sangría no se especifica correctamente.

24

SystemError

Se genera cuando el intérprete encuentra un problema interno, pero cuando se encuentra este error, el intérprete de Python no sale.

25

SystemExit

Se genera cuando se cierra el intérprete de Python mediante la función sys.exit (). Si no se maneja en el código, hace que el intérprete salga.

26

TypeError

Se genera cuando se intenta una operación o función que no es válida para el tipo de datos especificado.

27

ValueError

Se genera cuando la función incorporada para un tipo de datos tiene el tipo válido de argumentos, pero los argumentos tienen valores no válidos especificados.

28

RuntimeError

Se genera cuando un error generado no entra en ninguna categoría.

29

NotImplementedError

Se genera cuando un método abstracto que debe implementarse en una clase heredada no se implementa realmente.

Afirmaciones en Python

Una afirmación es una verificación de cordura que puede activar o desactivar cuando haya terminado con la prueba del programa.

La forma más fácil de pensar en una afirmación es compararla con una raise-ifdeclaración (o para ser más precisos, una declaración de aumento si no). Se prueba una expresión y, si el resultado es falso, se genera una excepción.

Las afirmaciones se llevan a cabo mediante la declaración assert, la palabra clave más nueva de Python, introducida en la versión 1.5.

Los programadores a menudo colocan aserciones al comienzo de una función para verificar una entrada válida y después de una llamada de función para verificar una salida válida.

La declaración de aserción

Cuando encuentra una declaración de aserción, Python evalúa la expresión que la acompaña, que es de esperar que sea verdadera. Si la expresión es falsa, Python genera una excepción AssertionError .

los syntax para afirmar es -

assert Expression[, Arguments]

Si la aserción falla, Python usa ArgumentExpression como argumento para AssertionError. Las excepciones AssertionError se pueden capturar y manejar como cualquier otra excepción usando la declaración try-except, pero si no se manejan, terminarán el programa y producirán un rastreo.

Ejemplo

Aquí hay una función que convierte una temperatura de grados Kelvin a grados Fahrenheit. Dado que cero grados Kelvin es tan frío como se pone, la función se rescata si ve una temperatura negativa:

#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Colder than absolute zero!"
   return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)

Cuando se ejecuta el código anterior, produce el siguiente resultado:

32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

¿Qué es la excepción?

Una excepción es un evento que ocurre durante la ejecución de un programa que interrumpe el flujo normal de las instrucciones del programa. En general, cuando una secuencia de comandos de Python encuentra una situación que no puede afrontar, genera una excepción. Una excepción es un objeto de Python que representa un error.

Cuando una secuencia de comandos de Python genera una excepción, debe manejar la excepción inmediatamente, de lo contrario, termina y se cierra.

Manejando una excepción

Si tiene algún código sospechoso que pueda generar una excepción, puede defender su programa colocando el código sospechoso en untry:bloquear. Después del bloque try:, incluya unexcept: declaración, seguida de un bloque de código que maneja el problema de la manera más elegante posible.

Sintaxis

Aquí hay una sintaxis simple de try .... excepto ... bloques else -

try:
   You do your operations here;
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Aquí hay algunos puntos importantes sobre la sintaxis mencionada anteriormente:

  • Una sola declaración try puede tener varias declaraciones except. Esto es útil cuando el bloque try contiene declaraciones que pueden generar diferentes tipos de excepciones.

  • También puede proporcionar una cláusula except genérica, que maneja cualquier excepción.

  • Después de la (s) cláusula (s) except, puede incluir una cláusula else. El código del bloque else se ejecuta si el código del bloque try: no genera una excepción.

  • El bloque else es un buen lugar para el código que no necesita la protección de try: block.

Ejemplo

Este ejemplo abre un archivo, escribe contenido en el archivo, y sale con elegancia porque no hay ningún problema.

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print "Error: can\'t find file or read data"
else:
   print "Written content in the file successfully"
   fh.close()

Esto produce el siguiente resultado:

Written content in the file successfully

Ejemplo

Este ejemplo intenta abrir un archivo donde no tiene permiso de escritura, por lo que genera una excepción:

#!/usr/bin/python

try:
   fh = open("testfile", "r")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print "Error: can\'t find file or read data"
else:
   print "Written content in the file successfully"

Esto produce el siguiente resultado:

Error: can't find file or read data

La cláusula except sin excepciones

También puede usar la declaración except sin excepciones definidas de la siguiente manera:

try:
   You do your operations here;
   ......................
except:
   If there is any exception, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Este tipo de try-exceptdeclaración captura todas las excepciones que ocurren. Sin embargo, el uso de este tipo de declaración try-except no se considera una buena práctica de programación, ya que detecta todas las excepciones, pero no hace que el programador identifique la causa raíz del problema que puede ocurrir.

La cláusula except con múltiples excepciones

También puede usar la misma declaración except para manejar múltiples excepciones de la siguiente manera:

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block.

La cláusula de intentar finalmente

Puedes usar un finally: bloque junto con un try:bloquear. El bloque finalmente es un lugar para colocar cualquier código que deba ejecutarse, ya sea que el bloque try haya generado una excepción o no. La sintaxis de la declaración de intentar finalmente es la siguiente:

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

No puede usar la cláusula else junto con una cláusula finalmente.

Ejemplo

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
finally:
   print "Error: can\'t find file or read data"

Si no tiene permiso para abrir el archivo en modo de escritura, esto producirá el siguiente resultado:

Error: can't find file or read data

El mismo ejemplo se puede escribir de manera más clara de la siguiente manera:

#!/usr/bin/python

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print "Going to close the file"
      fh.close()
except IOError:
   print "Error: can\'t find file or read data"

Cuando se lanza una excepción en el bloque try , la ejecución pasa inmediatamente al bloque finalmente . Después de que se ejecutan todas las declaraciones en el bloque finalmente , la excepción se genera nuevamente y se maneja en las declaraciones excepto si está presente en la siguiente capa superior de la declaración try-except .

Argumento de una excepción

Una excepción puede tener un argumento , que es un valor que brinda información adicional sobre el problema. El contenido del argumento varía según la excepción. Captura el argumento de una excepción proporcionando una variable en la cláusula except de la siguiente manera:

try:
   You do your operations here;
   ......................
except ExceptionType, Argument:
   You can print value of Argument here...

Si escribe el código para manejar una sola excepción, puede hacer que una variable siga al nombre de la excepción en la declaración except. Si está capturando varias excepciones, puede hacer que una variable siga a la tupla de la excepción.

Esta variable recibe el valor de la excepción que contiene principalmente la causa de la excepción. La variable puede recibir un valor único o varios valores en forma de tupla. Esta tupla generalmente contiene la cadena de error, el número de error y una ubicación del error.

Ejemplo

A continuación se muestra un ejemplo de una única excepción:

#!/usr/bin/python

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError, Argument:
      print "The argument does not contain numbers\n", Argument

# Call above function here.
temp_convert("xyz");

Esto produce el siguiente resultado:

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

Plantear una excepción

Puede generar excepciones de varias formas utilizando la declaración de aumento. La sintaxis general de laraise declaración es la siguiente.

Sintaxis

raise [Exception [, args [, traceback]]]

Aquí, Exception es el tipo de excepción (por ejemplo, NameError) y argumento es un valor para el argumento de excepción. El argumento es opcional; si no se proporciona, el argumento de excepción es Ninguno.

El argumento final, rastreo, también es opcional (y rara vez se usa en la práctica) y, si está presente, es el objeto de rastreo usado para la excepción.

Ejemplo

Una excepción puede ser una cadena, una clase o un objeto. La mayoría de las excepciones que genera el núcleo de Python son clases, con un argumento que es una instancia de la clase. Definir nuevas excepciones es bastante fácil y se puede hacer de la siguiente manera:

def functionName( level ):
   if level < 1:
      raise "Invalid level!", level
      # The code below to this would not be executed
      # if we raise the exception

Note:Para detectar una excepción, una cláusula "excepto" debe hacer referencia a la misma excepción lanzada, ya sea un objeto de clase o una cadena simple. Por ejemplo, para capturar la excepción anterior, debemos escribir la cláusula except de la siguiente manera:

try:
   Business Logic here...
except "Invalid level!":
   Exception handling here...
else:
   Rest of the code here...

Excepciones definidas por el usuario

Python también le permite crear sus propias excepciones derivando clases de las excepciones estándar integradas.

Aquí hay un ejemplo relacionado con RuntimeError . Aquí, se crea una clase que se subclasifica de RuntimeError . Esto es útil cuando necesita mostrar información más específica cuando se detecta una excepción.

En el bloque try, la excepción definida por el usuario se genera y se captura en el bloque except. La variable e se usa para crear una instancia de la clase Networkerror .

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

Entonces, una vez que haya definido la clase anterior, puede generar la excepción de la siguiente manera:

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args