Manejo de excepciones de Python usando la declaración try, except y finalmente

En este tutorial, aprenderá cómo manejar excepciones en su programa Python usando declaraciones try, except y finalmente con la ayuda de ejemplos.

Video: Manejo de excepciones de Python (intente… excepto… finalmente)

Excepciones en Python

Python tiene muchas excepciones integradas que se generan cuando su programa encuentra un error (algo en el programa sale mal).

Cuando ocurren estas excepciones, el intérprete de Python detiene el proceso actual y lo pasa al proceso de llamada hasta que se maneja. Si no se maneja, el programa se bloqueará.

Por ejemplo, consideremos un programa en el que tenemos una función Aque llama a la función B, que a su vez llama a la función C. Si ocurre una excepción en la función Cpero no se maneja en C, la excepción pasa ay Bluego a A.

Si nunca se maneja, se muestra un mensaje de error y nuestro programa se detiene repentinamente e inesperadamente.

Captura de excepciones en Python

En Python, las excepciones se pueden manejar mediante una trydeclaración.

La operación crítica que puede generar una excepción se coloca dentro de la trycláusula. El código que maneja las excepciones está escrito en la exceptcláusula.

Por lo tanto, podemos elegir qué operaciones realizar una vez que hayamos detectado la excepción. He aquí un ejemplo sencillo.

 # import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()(0), "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)

Salida

La entrada es un ¡Ups! ocurrió. Entrada siguiente. La entrada es 0 ¡Ups! Ocurrió. Entrada siguiente. La entrada es 2 El recíproco de 2 es 0.5

En este programa, recorremos los valores de la lista randomList. Como se mencionó anteriormente, la parte que puede causar una excepción se coloca dentro del trybloque.

Si no ocurre ninguna excepción, el exceptbloque se salta y el flujo normal continúa (para el último valor). Pero si se produce alguna excepción, el exceptbloque la detecta (primer y segundo valor).

Aquí, imprimimos el nombre de la excepción usando la exc_info()función dentro del sysmódulo. Podemos ver que acausas ValueErrory 0causas ZeroDivisionError.

Dado que cada excepción en Python hereda de la Exceptionclase base , también podemos realizar la tarea anterior de la siguiente manera:

 # import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)

Este programa tiene la misma salida que el programa anterior.

Captura de excepciones específicas en Python

En el ejemplo anterior, no mencionamos ninguna excepción específica en la exceptcláusula.

Esta no es una buena práctica de programación ya que detectará todas las excepciones y manejará todos los casos de la misma manera. Podemos especificar qué excepciones exceptdebe atrapar una cláusula.

Una trycláusula puede tener cualquier número de exceptcláusulas para manejar diferentes excepciones, sin embargo, solo se ejecutará una en caso de que ocurra una excepción.

Podemos usar una tupla de valores para especificar múltiples excepciones en una cláusula except. Aquí hay un pseudocódigo de ejemplo.

 try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass

Generando excepciones en Python

En la programación de Python, se generan excepciones cuando se producen errores en tiempo de ejecución. También podemos generar excepciones manualmente utilizando la raisepalabra clave.

Opcionalmente, podemos pasar valores a la excepción para aclarar por qué se generó esa excepción.

 >>> raise KeyboardInterrupt Traceback (most recent call last):… KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last):… MemoryError: This is an argument >>> try:… a = int(input("Enter a positive integer: "))… if a <= 0:… raise ValueError("That is not a positive number!")… except ValueError as ve:… print(ve)… Enter a positive integer: -2 That is not a positive number!

Prueba de Python con la cláusula else

En algunas situaciones, es posible que desee ejecutar un determinado bloque de código si el bloque de código interno se tryejecutó sin errores. Para estos casos, puede utilizar la elsepalabra clave opcional con la trydeclaración.

Nota : Las excepciones en la cláusula else no son manejadas por las cláusulas except anteriores.

Veamos un ejemplo:

 # program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)

Salida

Si pasamos un número impar:

 Ingrese un número: 1 ¡Ni un número par!

Si pasamos un número par, el recíproco se calcula y se muestra.

 Ingrese un número: 4 0.25

Sin embargo, si pasamos 0, obtenemos ZeroDivisionErrorque el bloque de código interno elseno es manejado por preceder except.

 Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero

Python try… finally

The try statement in Python can have an optional finally clause. This clause is executed no matter what, and is generally used to release external resources.

For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).

In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally clause to guarantee the execution.

Here is an example of file operations to illustrate this.

 try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()

Este tipo de construcción asegura que el archivo se cierre incluso si ocurre una excepción durante la ejecución del programa.

Articulos interesantes...