Python 3 per a no programadors/Fent front a les imperfeccions


...o còm manegar els errors

modifica

Així que teniu el programa perfecte, funciona impecablement, tret d'un detall, petarà si l'usuari entra dades invàlides. No us espanteu, a Python hi ha una estructura de control especial per a vosaltres. S'anomena try i prova quelcom. Aquí hi ha un exemple d'un programa amb un problema:

print("Teclegeu Control C o -1 per sortir")
nombre = 1
while nombre != -1:
   nombre = int(input("Teclegeu un nombre: "))
   print("Heu entrat:", nombre)

Fixeu-vos com quan teclejau @#& dóna quelcom de l'estil:

Traceback (most recent call last):
 File "prova.py", line 4, in <module>
   nombre = int(input("Teclegeu un nombre: "))
ValueError: invalid literal for int() with base 10: '\\@#&'

Com vodeu veure a la funció int() no li agrada el nombre @#& (com ha de ser). L'última línia mostra quin és el problema; Python ha trobat un ValueError. Com pot tractar això el vostre programa? El que podeu fer és primer: posar la instrucció on es poden produir errors dins d'un bloc try, i segon: dir-li a Python com voleu manegar els ValueErrors. El següent programa fa això:


print("Teclegeu Control C o -1 per sortir")
nombre = 1
while nombre != -1:
   nombre = int(input("Teclegeu un nombre: "))
   print("Heu entrat:", nombre)
    try:
        nombre = int(input("Teclegeu un nombre: "))
        print("Heu entrat:", nombre)
    except ValueError:
        print(u"Això no era un nombre.")

Ara quan s'executi el nou programa i se li entri @#& dirà "Això no era un nombre." i continuarà amb el que estava fent abans.

Quan el vostre programa contingui algun error que sabeu com manejar, fiqueu el codi dins d'un bloc try, i fiqueu la manera de manegar l'error al bloc except.

Exercicis

modifica

Actualitzeu pel capbaix l'últim programa de números de telèfon (al capítol Diccionaris) de manera que no peti si un usuari entra qualsevol dada al menú.