sábado, 1 de febrero de 2014

Excepciones




Las excepciones o errores que se pueden producir durante la ejecución de un programa Python se gestionan con una construcción try-except. Una excepción puede ocurrir al intentar operar con datos de distinto tipo, dividir un número por cero, teclear un tipo de dato no esperado, acceder a un archivo que no existe y en otras situaciones previsibles. Para cuando sucedan es importante decidir qué respuesta dar en cada caso y evitar que el programa suspenda su ejecución de manera inesperada.

En el bloque try se incluye el código que puede producir la excepción y en except el código que la tratará convenientemente. En un bloque except TipoError se capturará un tipo de error concreto, que habrá que indicarlo. Por ejemplo, si se intenta convertir una cadena de texto de caracteres alfabéticos a número entero el tipo es ValueError o si se opera con una variable no declarada el tipo es NameError.

try:  # contiene el código que puede producir la excepción
except:  # contiene el código que gestionará cualquier error
except TipoError:  # contiene el código que gestionará un tipo de error concreto
else:  # contiene el código que se ejecutará en caso de no haber error
finally:  # contiene el código que se ejecutará en cualquier caso.

El siguiente ejemplo calcula el factorial de un número. Si no se introduce un número entero se producirá una excepción:

try:
    numero = int(input('Introducir un número: '))
    factorial = 1
    for num in range(1, numero+1):
        factorial *= num

    print(factorial) 

except:
    print('Debe introducir un número entero') 

A continuación, se utilizan el resto de clausulas disponibles para la gestión de excepciones.

try:  # Bloque de código a “vigilar”
    texto = input('Teclear :')  # introducir un dato

except KeyboardInterrupt:  # captura excepción de interrupción 
    print('\nSe ha pulsado ctrl+c') # Interrupción al presionar Ctrl+c

else:  # se ejecuta si no hay error
    print('Ha tecleado {}'.format(texto)) # muestra cadena introducida
 
finally:  # se ejecuta tanto si hay error como si no
    print('fin de programa')  # muestra mensaje final

Excepciones a medida


La flexibilidad en la gestión de excepciones se amplia cuando los programadores pueden definir sus propios tipos de errores. Para ello, es necesario crear una clase que herede de la clase Exception o de alguna de sus hijas y después llamarla con raise:

# Define clase a partir de Exception
class LongPassw(Exception):
    '''Excepción definida por usuario'''
    def __init__(self, longitud):  # define método constructor ...   
        Exception.__init__(self)  # … de excepción ... 
        self.longitud = longitud  # … y con atributo longitud
  
try:  # bloque de código a vigilar
    clave = input('Teclear contraseña: ')  # introducir una cadena
    if len(clave) < 6:  # si longitud de cadena es menor de 6 
        raise LongPassw(len(clave))  # llama a excepción de usuario 

except LongPassw as lp:  # excepción de usuario   
    print('LongPassw: Error por longitud: {0}'.format(lp.longitud))

else:  # se ejecuta si no hay error
    print('No se ha producido error.')  # muestra mensaje

De obligado cumplimiento: assert


Con assert se fijan las condiciones que debe cumplir un objeto y si éstas no se cumplen en un momento determinado, producirá una excepción que hay que interceptar y tratar convenientemente.

En el siguiente ejemplo se define una lista con seis elementos. A continuación, mediante un bucle se irán eliminando elementos, uno a uno, desde el final de la lista. La condición establecida para que no se produzca la excepción es que la lista tenga al menos dos elementos. Cuando haya dos y se intente borrar de nuevo se producirá la excepción AssertionError.

try:  # bloque de código a vigilar
    lista = [1, 2, 3, 4, 5, 6]  # define lista
    print(lista)  # muestra lista
    while True:  # bucle infinito hasta error
        print('Elemento a borrar',lista[-1])
        lista.pop()  # borra elemento
        assert len(lista) > 1  # la lista debe tener al menos 2 
        print(lista)  # muestra lista después de borrado

except AssertionError:  # excepción para assert
    print('Error al intentar borrar elemento  ')  # mensaje de assert
    print('La lista debe contener al menos 2')



Ir al índice del tutorial de Python