Tema 12 - Depuración de errores
12.1 Cómo saber el número de línea actual
Un primer paso que nos ayude a descubrir errores puede ser saber en qué línea del programa nos encontramos. En la mayoría de versiones de Basic esto sólo se puede conseguir intercalando de vez en cuando algún PRINT que nos informe.
En cambio, en el Basic de los CPC la situación es más fácil. Para esa tarea tenemos la orden TRON (abreviatura de TRACE ON, "Rastreo activado"). A partir del momento en que tecleemos esa orden, se nos irá avisando de la línea del programa en la que nos encontramos, escribiendo su número en pantalla entre corchetes: [10][20][30]... Esto termina cuando utilicemos la orden TROFF (Trace Off, "rastreo desactivado").
Por ejemplo, con este programa que repite tres veces las líneas 10 a 30 (sin escribir nada en pantalla) y termina en la 40:
10 FOR a = 1 TO 3
20 REM Linea vacia
30 NEXT
40 REM Ultima linea
El resultado si usamos la orden TRON sería:
[10][20][30][10][20][30][10][20][30][40]
12.2 Interceptando errores
Las ordenes TRON y TROFF ayudan a localizar errores, pero "ensucian" la pantalla, algo que no se puede permitir cuando un programa esta "terminado", solo cuando aún estamos haciendo pruebas.
Pero en un programa "terminado" también hay posibles motivos de problemas. Uno de los más frecuentes es el manejo de ficheros: podemos intentar leer un fichero que no existe (por ejemplo por haber indicado un nombre incorrecto), o intentar grabar en un disco que esta lleno o protegido contar escritura.
Para este tipo de situaciones es útil la orden ON ERROR, que salta a otra parte del programa en caso de encontrarse con un error.
En esa otra parte de "tratamiento de errores" podríamos analizar en que línea ha ocurrido el problema (nos lo indica la función ERL), y también, y más importante, ERR que indica el número de error. Si el error está relacionado con acceso a disco, es DERR la que nos dará más detalles sobre el problema exacto que ha encontrado.
Los códigos de error de ERR (los que habitualmente resultan menos útiles desde dentro de un programa) son:
1 Unexpected NEXT: Se ha encontrado un NEXT sin que hubiera antes un FOR.
2 Syntax error: Error de sintaxis (típicamente, una orden mal escrita, como "RUM" en vez de "RUN")
3 Unexpected RETURN: Se ha encontrado un RETURN sin que hubiera antes un GOSUB.
4 DATA exhausted: Se ha intentado leer con READ pero no había suficientes datos en el correspondiente DATA
5 Improper argument: Argumento no adecuado (es un error genérico; es más habitual encontrar el 13, Type Mismatch)
6 Overflow: El resultado de una operación es un numero demasiado grande
7 Memory full: No queda memoria disponible.
8 Line does not exist: La línea no existe (por ejemplo, en un GOTO).
9 Subscript out of range: Se ha intentado leer (o escribir) más allá del límite de un array.
10 Array already dimensioned: Se ha intentado crear con DIM un array que ya existía.
11 Division by zero: Se ha intentado dividir entre cero.
12 Invalid direct command: Se ha tecleado una orden que no es válida como orden directa, sólo como parte de un programa, como es el caso de RETURN.
13 Type mismatch: El tipo de un dato no es el correcto (por ejemplo, si se intenta guardar una cadena en una variable numérica, como en x="Hola" o en PRINT "Hola"+3).
14 String space full: No queda espacio para más cadenas de texto.
15 String too long: Una cadena es demasiado larga (más de 255 caracteres)
16 String expression too complex: Una expresión es demasiado compleja y el ordenador no consigue analizarla.
17 Cannot continue: No se puede continuar tras una orden STOP, típicamente porque se haya modificado el programa.
18 Unknown user function: Se ha intentado llamar una una función con FN, sin haberla definido antes.
19 RESUME missing: El programa ha acabado inesperadamente tras un ON ERROR.
20 Unexpected RESUME: Se ha encontrado una orden RESUME sin haber pasado antes por un ON ERROR.
21 Direct command found: Al cargar un programa, se ha encontrado una línea sin número.
22 Operand missing: Una operación está incompleta, como en “PRINT 2+”
23 Line too long: La línea es demasiado larga (no se permiten más de 255 caracteres por línea)
24 EOF met: Se ha encontrado el final de fichero mientras se intentaba leer.
25 File type error: El tipo de fichero es incorrecto, típicamente por abrir con OPENIN un fichero que no es de texto.
26 NEXT missing: Hay un FOR que no termina en NEXT.
27 File already open: Se ha tratado de abrir un fichero que ya estaba abierto.
28 Unknown command: Se ha tratado de abrir un fichero que ya estaba abierto.
29 WEND missing: Hay un WHILE que no termina en WEND.
30 Unexpected WEND: Hay un WEND que no está precedido por un WHILE
31 File not open: Se ha intentado leer de un fichero sin abrirlo previamente
32 Broken in: Se ha interrumpido una operación en un fichero.
En los CPC equipados con unidad de disco, cuando ERR vale 32 es cuando podemos mirar el valor de DERR para saber más detalles. Los posibles valores del código de error de disco, DERR son:
0 o 22: Se ha pulsado ESC
142 Canal no válido
143 Fin de fichero (hardware)
144 Orden incorrecta, generalmente nombre de fichero incorrecto
145 El fichero ya existe
146 El fichero no existe
147 Directorio lleno
148 Disco lleno
149 Disco cambiado mientras había ficheros abiertos
150 Disco sólo de lectura
154 Fin de fichero (software)
12.3 Seguir tras un error
Finalmente, una vez "solucionado" el problema, generalmente querremos que el programa prosiga, de lo que se encarga la orden RESUME. Ésta se puede usar básicamente de dos formas: indicando un numero de línea (RESUME 200) o pidiendo que continúe en la línea siguiente a la que lanzó el error (RESUME NEXT).