Programación con Amstrad CPC
Por Nacho Cabanes, versión 0.32, de 29-May-2008

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" tambien 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" podriamos analizar en que línea ha ocurrido el problema (nos lo indica la funcion 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:

(Nota: todavía no están todos traducidos; lo estarán pronto)

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)
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
6 Overflow
7 Memory full
8 Line does not exist: La línea no existe (por ejemplo, en un GOTO)
9 Subscript out of range
10 Array already dimensionned
11 Division by zero
12 Invalid direct command
13 Type mismatch
14 String space full
15 String too long
16 String expression too complex
17 Cannot continue
18 Unknown user function
19 RESUME missing
20 Unexpected RESUME
21 Direct command found: Al cargar un programa, se ha encontrado una línea sin número.
22 Operand missing
23 line too long
24 EOF met
25 File type error
26 NEXT missing: Hay un FOR que no termina en NEXT.
27 File already open
28 Unknown command
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).