Manejo de Excepciones en Python

Manejo de excepciones

En la computación y la programación de computadoras, el manejo de excepciones es el proceso de responder a la ocurrencia de excepciones, condiciones anómalas o excepcionales que requieren un procesamiento especial.

Python tiene muchas excepciones incorporadas que se generan cuando un programa encuentra un error, y la mayoría de las bibliotecas externas, como la popular Requests, incluyen sus propias excepciones personalizadas con las que tendremos que lidiar.

Manejo básico de excepciones

No se puede dividir por cero, eso es una verdad matemática, y si intentas hacerlo en Python, el intérprete generará la excepción incorporada ZeroDivisionError:

def divide(dividend , divisor):
    print(dividend / divisor)

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

Supongamos que no queremos que nuestro programa detenga su ejecución o muestre al usuario una salida que no entenderá. Digamos que queremos imprimir un mensaje útil y claro, entonces necesitamos manejar la excepción con las palabras clave try y except:

# try-except: manejar excepciones con elegancia
def divide(dividend , divisor):
    try:  # Intenta ejecutar este código
        print(dividend / divisor)
    except ZeroDivisionError:  # Captura el tipo de excepción específico
        print('No se puede dividir por 0')

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
No se puede dividir por 0
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué palabras clave se utilizan para manejar excepciones en Python?
A. try y except
B. catch y handle
C. error y rescue
D. if y else

Manejo de Múltiples excepciones usando un bloque de excepción

También puedes manejar múltiples excepciones en una sola línea como la siguiente sin la necesidad de crear múltiples bloques de excepción.

# Manejar múltiples excepciones en un bloque except
def divide(dividend , divisor):
    try:
        if (dividend == 10):
          var = 'str' + 1  # Esto generará TypeError
        else:
          print(dividend / divisor)
    except (ZeroDivisionError, TypeError) as error:  # Capturar múltiples tipos de excepción
        print(error)  # Imprimir el mensaje de error

divide(dividend=20, divisor=5)
4
divide(dividend=10, divisor=5)
can only concatenate str (not "int") to str
divide(dividend=10, divisor=0)
division by zero
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Se pueden manejar múltiples tipos de excepción en un solo bloque except?
A. No, debes usar bloques except separados para cada tipo de excepción
B. Sí, poniéndolos en una tupla como except (Exception1, Exception2)
C. Sí, pero solo si están relacionados
D. No, Python no soporta esto

Código Finally en el manejo de excepciones

El código dentro de la sección finally siempre se ejecuta, sin importar si se ha generado una excepción o no:

# Bloque finally: siempre se ejecuta independientemente de las excepciones
def divide(dividend , divisor):
    try:
        print(dividend / divisor)
    except ZeroDivisionError:
        print('No se puede dividir por 0')
    finally:  # Siempre se ejecuta, incluso si ocurre una excepción
        print('Ejecución finalizada')

divide(dividend=10, divisor=5)
2.0
Ejecución finalizada
divide(dividend=10, divisor=0)
No se puede dividir por 0
Ejecución finalizada
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Cuándo se ejecuta el bloque finally?
A. Solo cuando ocurre una excepción
B. Solo cuando no ocurre ninguna excepción
C. Siempre, independientemente de si ocurrió o no una excepción
D. Nunca

Excepciones Personalizadas

Las excepciones personalizadas se inicializan creando una class que hereda de la clase base Exception de Python, y se generan usando la palabra clave raise:

# Excepción personalizada: se crea heredando de la clase Exception
class MyCustomException(Exception):
    pass

raise MyCustomException  # Generar la excepción personalizada
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException

Para declarar un mensaje de excepción personalizado, puedes pasarlo como parámetro:

class MyCustomException(Exception):
    pass

raise MyCustomException('Un mensaje personalizado para mi excepción personalizada')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException: Un mensaje personalizado para mi excepción personalizada

Manejar una excepción personalizada es igual que cualquier otra:

try:
    raise MyCustomException('Un mensaje personalizado para mi excepción personalizada')
except MyCustomException:
    print('Se generó mi excepción personalizada')
Se generó mi excepción personalizada
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Cómo se crea una excepción personalizada en Python?
A. Creando una clase que herede de la clase Exception
B. Usando el decorador @exception
C. Llamando a Exception.create()
D. Importándola de un módulo especial

Enlaces relevantes