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ú.