Capítol 3

Gestió d'errors en un codi

Quan un programa no fa el que volem, diem que hi ha un error. Però no tots els errors són iguals. N'hi ha uns que apareixen abans que en Karel faci cap moviment, i n'hi ha que apareixen un cop s'ha iniciat el programa.

On pot fallar un programa?

Quan prems ▶ Executa, el sistema fa dues coses, i en aquest ordre:

  1. En primer lloc, llegeix el codi sencer, per entendre què ha de fer.
  2. En segon lloc, executa les instruccions, una per una.

Els errors poden ocorrer a la primera fase o a la segona. Els que apareixen a la primera fase s'anomenen errors de sintaxi. Els que apareixen a la segona, errors d'execució.

Error de sintaxi: el codi està mal escrit

Un error de sintaxi vol dir que el codi té alguna paraula o símbol que el sistema no entén.

Exemples habituals d'errors de sintaxi:

  • Oblidar els parèntesis: move en lloc de move().
  • Escriure malament una ordre: mov() o turnleft() en lloc de turn_left().
  • Oblidar els dos punts: for i in range(3) en lloc de for i in range(3):.
  • Indentar malament les línies d'un bloc.

La característica clau és aquesta: aquest error es detecta abans que en Karel faci cap acció. El sistema llegeix el codi, troba que no l'entén, i s'atura immediatament. En Karel ni arriba a sortir de la seva casella.

En l'exemple següent, el codi té dues línies correctes i una tercera amb un error de sintaxi (falta els parèntesis a move). Executa'l i observa què passa:

En Karel no s'ha mogut gens, tot i que les dues primeres línies eren correctes. Per què? Perquè el sistema llegeix el codi sencer abans d'executar-lo. Com que la tercera línia no s'entén, rebutja tot el programa sense executar-ne cap part.

Per corregir un error de sintaxi, llegeix el missatge d'error al log (la finestra inferior): t'indicarà en quina línia és el problema. Després revisa aquella línia amb atenció, busca el detall tipogràfic (un parèntesi, un caràcter oblidat, una paraula mal escrita) i corregeix-lo.

Error d'execució: en Karel fa una cosa no permesa

Un error d'execució vol dir que el codi està ben escrit (el sistema l'entén), però a mig camí en Karel intenta fer una cosa que no és permesa amb les regles d'aquell món. El programa comença bé, es va executant, i en un moment concret s'atura amb un error.

Exemples típics d'errors d'execució:

  • Intentar avançar quan tens una paret al davant (en Karel xoca).
  • Intentar avançar quan tens una roca al davant (en Karel xoca).
  • Fer grab() en una casella on no hi ha cap perla.
  • Fer drop() quan la motxilla no conté cap perla.

La característica clau és aquesta: aquest error es detecta durant l'execució. En Karel comença a fer diverses accions, i s'atura just en el moment concret en què l'acció no és correcta.

En l'exemple següent, el codi té cinc ordres move(). Però el món només té cinc columnes i en Karel comença a la primera. Executa'l i observa que en Karel avança unes quantes caselles abans que el programa s'aturi:

Veus la diferència? En el cas anterior (error de sintaxi) en Karel no es movia gens. Ara en Karel ha fet part del camí abans d'aturar-se. El codi estava ben escrit; el problema és que la lògica no encaixa amb el món.

Comparativa dels dos tipus

Aquesta taula resumeix la diferència:

Error de sintaxi Error d'execució
Quan es detecta L'error s'assenyala immediatament i el programa no s'inicia. L'error ocorre durant l'execució del codi, en l'instant on en Karel realitza una acció no permesa.
Què fa en Karel En Karel no fa res, perquè no s'executa ni la primera línia de codi. En Karel es mou i fa accions, fins al moment on hi ha una acció no permesa. Llavors, s'atura.
Com es corregeix Els errors de sintaxi són senzills de resoldre: has de trobar una errada tipogràfica o de descuit (parèntesis, dos punts, nom mal escrit). Els errors d'execució no sempre són immediats de resoldre: has de repensar la lògica del programa, o bé canviar l'ordre de les accions, o bé afegir o treure instruccions.

Exercici

El codi següent té un error. En Karel hauria d'avançar tres caselles i recollir la perla que hi ha al final però, tal i com està escrit, no funciona. Llegeix el missatge d'error, identifica de quin tipus és, i corregeix el codi.