DMarlon Studio

Lección 18 · 18 de 20

Errores con try y except · Python

Capture los errores de su programa de Python con try y except para que no se detenga: números mal escritos, divisiones por cero y claves que faltan.

Python · Errores con try y except en DMarlon Studio: el código del ejemplo y su salida en la terminal

Cuando algo sale mal, Python lanza una excepción y, si nadie la atiende, el programa se detiene con un mensaje de error. try permite intentarlo: si algo dentro del bloque falla, Python salta al except en vez de pararse.

En el primer bucle, int("seven") y int("3.5") lanzan un ValueError. El except ValueError: escribe un aviso y el bucle sigue con el siguiente texto, así que el total suma solo 42 y 15.

Un try puede tener varios except, uno por tipo de error. En slices_each(), dividir entre 0 da ZeroDivisionError, y dividir entre un texto, TypeError. El bloque else solo se ejecuta si no hubo error: es donde se escribe el resultado bueno.

Con except KeyError as error: se guarda el propio error en una variable para mostrarlo. Al pedir la clave "juice", que no existe en el diccionario, el mensaje dice exactamente cuál falta.

Código · main.py

# int() fails with text that is not a number: try catches it.answers = ["42", "seven", "3.5", "15"]total = 0for text in answers:    try:        number = int(text)        total += number        print(f"'{text}' -> {number}")    except ValueError:        print(f"'{text}' is not a whole number, skipped")print("Total:", total)# Different errors, different except blocks.def slices_each(pizzas, people):    try:        slices = pizzas * 8 // people    except ZeroDivisionError:        print("Nobody to share with!")    except TypeError:        print("People must be a number.")    else:  # runs only if there was no error        print(f"{people} people get {slices} slices each")slices_each(3, 4)slices_each(3, 0)slices_each(3, "four")# as gives you the error itself, with its message.prices = {"tea": 1.5, "coffee": 1.8}try:    print(prices["juice"])except KeyError as error:    print("No price for", error)

Salida · python3 main.py

'42' -> 42
'seven' is not a whole number, skipped
'3.5' is not a whole number, skipped
'15' -> 15
Total: 57
4 people get 6 slices each
Nobody to share with!
People must be a number.
No price for 'juice'

Para recordar

  • El código que puede fallar va dentro de try:.
  • except TipoDeError: atiende solo ese tipo de error.
  • else: se ejecuta si no hubo ningún error.
  • except ... as e: da acceso al error y su mensaje.
  • Capture errores concretos, no todos a la vez.

Ejercicio

Escriba una función ask_number() que lea un número con input() y, si no es válido, lo vuelva a pedir dentro de un while hasta que lo sea. Pruébela con un input.txt con dos líneas erróneas y una buena.