1.11. Manejo de excepciones

Hay dos tipos de errores que normalmente ocurren al escribir programas. El primero, conocido como un error de sintaxis, simplemente significa que el programador ha cometido un error en la estructura de una instrución o de una expresión. Por ejemplo, es incorrecto escribir una instrucción for y olvidar los dos puntos.

>>> for i in range(10)
SyntaxError: invalid syntax (<pyshell#61>, line 1)

En este caso, el intérprete de Python ha encontrado que no puede completar el procesamiento de esta instrucción ya que no se ajusta a las reglas del lenguaje. Los errores de sintaxis suelen ser más frecuentes cuando se está comenzando a aprender un lenguaje.

El otro tipo de error, conocido como un error lógico, denota una situación en la que el programa se ejecuta pero da el resultado incorrecto. Esto puede deberse a un error en el algoritmo en el que está basado el programa o a un error en la traducción de ese algoritmo. En algunos casos, los errores lógicos conducen a situaciones muy malas, como tratar de dividir por cero o tratar de acceder a un ítem en una lista donde el índice del ítem está fuera de los límites de la lista. En este caso, el error lógico conduce a un error en tiempo de ejecución que hace que el programa se interrumpa. Estos tipos de errores en tiempo de ejecución típicamente se llaman excepciones.

La mayoría de las veces, los programadores principiantes simplemente piensan en las excepciones como errores fatales en tiempo de ejecución que causan que la ejecución finalice. Sin embargo, la mayoría de los lenguajes de programación proporcionan una manera de lidiar con estos errores que permitirán al programador tener algún tipo de intervención si así lo desean. Además, los programadores pueden crear sus propias excepciones si detectan una situación en la ejecución del programa que lo justifique.

Cuando se produce una excepción, decimos que se ha “generado”. Usted puede “manejar” la excepción que se ha generado utilizando una instrucción try. Por ejemplo, considere la siguiente sesión que solicita al usuario un número entero y luego llama a la función raíz cuadrada de la biblioteca de matemáticas. Si el usuario introduce un valor mayor o igual a 0, el print mostrará la raíz cuadrada. Sin embargo, si el usuario ingresa un valor negativo, la función raíz cuadrada reportará una excepción ValueError.

>>> unNumero = int(input("Por favor ingrese un entero "))
Por favor ingrese un entero -23
>>> print(math.sqrt(unNumero))
Traceback (most recent call last):
  File "<pyshell#102>", line 1, in <module>
    print(math.sqrt(unNumero))
ValueError: math domain error
>>>

Podemos manejar esta excepción llamando a la función print desde dentro de un bloque try. Un bloque except correspondiente “captura” la excepción e imprime un mensaje para el usuario en caso de que se produzca una excepción. Por ejemplo:

>>> try:
       print(math.sqrt(unNumero))
    except:
       print("Valor incorrecto para la raíz cuadrada")
       print("Se usa el valor absoluto en sustitución")
       print(math.sqrt(abs(unNumero)))

Valor incorrecto para la raíz cuadrada
Se usa el valor absoluto en sustitución
4.79583152331
>>>

capturará el hecho de que una excepción ha sido generada por sqrt, imprimirá los mensajes para el usuario y utilizará el valor absoluto para asegurarse de que estamos tomando la raíz cuadrada de un número no negativo. Esto significa que el programa no se interrumpirá, sino que continuará con las instrucciones siguientes.

También es posible que un programador cause una excepción en tiempo de ejecución utilizando la instrucción raise. Por ejemplo, en lugar de llamar a la función raíz cuadrada con un número negativo, podríamos haber comprobado primero el valor y luego haber generado nuestra propia excepción. El siguiente fragmento de código muestra el resultado de la creación de una nueva excepción RuntimeError. Note que el programa se interrumpiría de todos modos, pero ahora la excepción que causó la interrupción es algo creado explícitamente por el programador.

>>> if unNumero < 0:
...    raise RuntimeError("Usted no puede usar un número negativo")
... else:
...    print(math.sqrt(unNumero))
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
RuntimeError: Usted no puede usar un número negativo
>>>

Existen muchos tipos de excepciones que pueden generarse además de la excepción RuntimeError mostrada anteriormente. Consulte el manual de referencia de Python para obtener una lista de todos los tipos de excepciones disponibles y aprender cómo crear las suyas propias.

You have attempted of activities on this page