Python – Sin excepciones, what else?

Objetivo: utilización de la claúsula ELSE en la gestión de excepciones en Python.

En el artículo anterior aprendimos a capturar selectivamente excepciones y escribimos código realmente robusto que realizaba una división entera a prueba de bombas.

El programa era capaz de responder a cualquier excepción fatal. Observa las respuestas personalizadas ante una división por cero o la introducción de un valor no numérico, así como la respuesta genérica ante cualquier otra eventualidad (como el intento de abortar el programa con Ctrl-C).

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida')
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')
    except:
        print('No sé qué has hecho, pero vuelve a intentarlo')

Pero ahora voy a plantearte un sencillo ejercicio. Quiero que modifiques el programa de modo que, cada vez que el código se ejecute libre de excepciones, aparezca un mensaje indicándolo.

Obviamente, lo siguiente no sirve:

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida')
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')
    except:
        print('No sé qué has hecho, pero vuelve a intentarlo')
    print("Todo ha ido como la seda")

El mensaje aparece en cada iteración, haya o no sucedido una excepción:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 4
El cociente de la división de ambos números es 2
Todo ha ido como la seda
Introduce el dividendo: 10
Introduce el divisor: 0
¡No, no, la división por cero no está permitida
Todo ha ido como la seda
Introduce el dividendo: 

Es un problema fácil de resolver, no obstante. Podemos hacer uso de una variable booleana para alertar de que se ha producido una excepción:

while True:
    try:
        sin_excepciones = True
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida')
        sin_excepciones = False
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')
        sin_excepciones = False
    except:
        print('No sé qué has hecho, pero vuelve a intentarlo')
        sin_excepciones = False
    if sin_excepciones:
        print("Todo ha ido como la seda")

Eso es lo que haríamos en otros lenguajes como Java o C++ (pero no en C, que ni siquiera maneja excepciones). Como vemos, ahora el mensaje aparece exclusivamente sólo si el código ha transcurrido libre de tropiezos:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
¡No, no, la división por cero no está permitida
Introduce el dividendo: 10
Introduce el divisor: 4
El cociente de la división de ambos números es 2
Todo ha ido como la seda
Introduce el dividendo: 

Pero esto no es Java ni C++, sino Python…

La sentencia TRY admite una claúsula ELSE para introducir en ella el código que queremos que se ejecute siempre y cuando no haya sucedido ninguna excepción.

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida')
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')
    except:
        print('No sé qué has hecho, pero vuelve a intentarlo')
    else:
        print("Todo ha ido como la seda")

Y ahora sí…

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
¡No, no, la división por cero no está permitida
Introduce el dividendo: 10
Introduce el divisor: 4
El cociente de la división de ambos números es 2
Todo ha ido como la seda
Introduce el dividendo: 

Así de sencillo.

Seguro que George Clooney diría, si supiera programar: Python, what else?

Javier Montero Gabarró


Python – Sin excepciones, what else?


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

2 opiniones en “Python – Sin excepciones, what else?”

  1. Qué bueno. No conocía la cláusula else en este contexto.
    Tus artículos sobre Python son muy buenos. Para mí, tienen ese toque justo de enseñarte algo que no sabías, sin enredarse demasiado y de forma muy clara.

Responder a Javier Montero Cancelar respuesta