Capítulo 7. Para su referencia
Parte 7: Mensajes de error de BASIC
Contenido:
- Mensajes de error de BASIC
- Unexpected NEXT.
- Syntax error.
- Unexpected RETURN.
- DATA exhausted.
- Improper argument.
- Overflow.
- Memory full.
- Line does not exist.
- Subscript out of range.
- Array already dimensioned.
- Division by zero.
- Invalid direct command.
- Type mismatch.
- String space full.
- String too long.
- String expression too complex.
- Cannot CONTinue.
- Unknown user function.
- RESUME missing.
- Unexpected RESUME.
- Direct command found.
- Operand missing.
- Line too long.
- EOF met.
- File type error.
- NEXT missing.
- File already open.
- Unknown command.
- WEND missing.
- Unexpected WEND.
- File not open.
- Broken in.
- Errores de disco en AMSDOS.
Mensajes de error de BASIC
1 Unexpected NEXT
Se ha encontrado un NEXT que no corresponde a ningún FOR, o bien la variable mencionada tras NEXT no coincide con la de FOR.
2 Syntax error
BASIC no puede entender la línea porque algo en ella no se ajusta a las reglas de sintaxis del lenguaje.
3 Unexpected RETURN
Se ha encontrado una orden RETURN fuera de una subrutina.
4 DATA exhausted
Una orden READ ha intentado leer más datos de los incluidos en líneas DATA.
5 Improper argument
Este es un error no específico. Puede haber algo incorrecto en el argumento de una función o en un parámetro de una orden.
6 Overflow
El resultado de una operación aritmética ha sobrepasado los márgenes aceptables. Si ha ocurrido en un número en punto flotante, el resultado ha sido mayor que 1.7E+38 (aprox.). También puede haber ocurrido al intentar convertir un número en punto flotante en un entero con signo de 16 bits.
7 Memory full
El programa actual o sus variables ocupan demasiado espacio en la memoria, el anidamiento de la estructura de control es demasiado profundo (demasiadas órdenes GOSUB, WHILE o FOR anidadas).
La orden MEMORY provoca este error si se intenta situar el límite de la memoria accesible a BASIC demasiado bajo, o tan alto que sea imposible. Obsérvese que los ficheros abiertos tienen un tampón dedicado a ellos, lo que puede restringir los valores correctos de MEMORY.
8 Line does not exist
Se ha mencionado un número de línea que no existe en el programa.
9 Subscript out of range
Uno de los subíndices mencionados en una lista es demasiado pequeño o demasiado grande.
10 Array already dimensioned
Una de las listas declaradas en una orden DIM ya ha sido dimensionada antes.
11 Division by zero
División por cero, que puede ocurrir en la división de números reales, en la división entera, en la operación MOD y en la exponenciación.
12 Invalid direct command
Se ha intentado dar como orden directa una orden que sólo es válida si va precedida de un número de línea.
13 Type mismatch
Incongruencia de tipos. Un dato es literal cuando tenía que ser numérico, o viceversa, o se ha introducido un dato no numérico en READ o INPUT.
14 String space full
Se han creado demasiadas cadenas literales y ya no hay espacio disponible para más, incluso después de reorganizar la memoria.
15 String too long
Una cadena literal consta de más de 255 caracteres. Puede haber sido generada por concatenación de otras.
16 String expression too complex
Expresión literal demasiado compleja. Las expresiones literales pueden generar valores intermedios; cuando el número de estos valores excede de un límite razonable, se produce este error.
17 Cannot CONTinue
No se puede reanudar la ejecución del programa con CONT. Obsérvese que CONT reanuda el programa después de una instrucción STOP, de [ESC] [ESC] o de un error, pero a condición de que no se modifique el programa durante la pausa.
18 Unknown user function
Se ha invocado una FN sin la correspondiente DEF FN.
19 RESUME missing
Se ha llegado al final del programa mientras se ejecutaba una rutina de gestión de errores (esto es, una rutina invocada por ON ERROR GOTO).
20 Unexpected RESUME
RESUME sólo es válida en una rutina de gestión de errores (esto es, en una rutina invocada por ON ERROR GOTO).
21 Direct command found
Al cargar un fichero se ha encontrado una línea sin número de línea.
22 Operand missing
BASIC ha encontrado una expresión incompleta.
23 Line too long
BASIC ha convertido a su forma interna una línea y ésta ha resultado ser demasiado larga.
24 EOF met
Se ha intentado leer más allá del final del fichero de entrada.
25 File type error
El fichero que se ha leído no es del tipo adecuado. OPENIN sólo puede abrir ficheros de texto ASCII. Análogamente, LOAD, RUN, etc., solamente pueden acceder a ficheros creados por SAVE.
26 NEXT missing
BASIC ha encontrado un FOR al que no corresponde ningún NEXT. La línea mencionada tras el mensaje es aquella en la que se encuentra el FOR.
27 File already open
Se ha ejecutado una orden OPENIN u OPENOUT sin previamente cerrar el fichero que estaba abierto.
28 Unknown command
BASIC no encuentra un comando externo que corresponda a lo que se ha escrito tras |.
29 WEND missing
BASIC ha encontrado un WHILE al que no corresponde ningún WEND.
30 Unexpected WEND
Se ha encontrado un WEND que no corresponde a ningún WHILE, o bien el WEND no concuerda con el WHILE del bucle actual.
31 File not open
Véase la sección "Errores de disco".
32 Broken in
Véase la sección "Errores de disco".
Errores de disco en AMSDOS
Hay varios errores que pueden producirse con ocasión del manejo de ficheros en disco. BASIC da a todos ellos el número de ERR 32; no obstante, DERR contiene información más específica cuando se detecta ese número de error. Los valores de DERR tienen el siguiente significado:
Error de AMSDOS | Valor de DERR | Causa del error |
---|---|---|
0 | 0 o 22 | Se ha pulsado [ESC]. |
14 | 142 (128+14) | El canal no se encuentra en situación correcta. |
15 | 143 (128+15) | Se ha alcanzado el final físico del fichero. |
16 | 144 (128+16) | Orden incorrecta: generalmente nombre de fichero incorrecto. |
17 | 145 (128+17) | El fichero ya existe. |
18 | 146 (128+18) | El fichero no existe. |
19 | 147 (128+19) | El directorio está lleno. |
20 | 148 (128+20) | El disco está lleno. |
21 | 149 (128+21) | Se ha cambiado el disco cuando había ficheros abiertos en él. |
22 | 150 (128+22) | El fichero es de "sólo lectura". |
26 | 154 (128+26) | Se ha llegado al final de los datos grabados en el fichero (final lógico del fichero). |
Si AMSDOS ya ha informado de un error, el bit 7 de DERR está a 1 y por lo tanto todos los valores de DERR están desplazados en 128 unidades.
Otros valores generados por DERR proceden del controlador del disco. Su significado se analiza bit a bit. El bit 6 siempre está a 1. El bit 7 indica si AMSDOS ha informado del error (según se ha explicado antes). El significado de los bits es el siguiente:
Bit | Significado |
---|---|
0 | Falta marca de direcciones. |
1 | No escribible. El disco está protegido. |
2 | Faltan datos. No se puede encontrar el sector. |
3 | No hay disco en la unidad, unidad no preparada. |
4 | Error de sincronización (velocidad). |
5 | Error de datos. Error CRC (comprobación de redundancia cíclica). |
6 | Siempre a 1, para indicar que es un error detectado por el controlador del disco. |
7 | A 1 si AMSDOS ya ha informado del error. |
ERR también puede dar el valor 31 si se ha intentado el acceso sin haber ningún fichero abierto. La forma recomendable de utilizar ERR y DERR consiste en incluir una instrucción ON ERROR GOTO que invoque una pequeña subrutina en la cual se compruebe si ERR es 31 o 32; si es 32, se puede examinar DERR para obtener mayor información sobre la naturaleza del error. Por ejemplo:
19 ON ERROR GOTO 1000
20 OPENOUT "fichero.asc"
30 WRITE #9,"prueba-datos"
40 CLOSEOUT
50 END
1000 erramsdos=(DERR AND &7F): REM mascara para bit 7
1010 IF ERR<31 THEN END
1020 IF ERR=31 THEN PRINT "Esta seguro de que ha tecleado la linea 20 correctamente?":END
1030 IF erramsdos=20 THEN PRINT "Disco lleno; ponga otro disco de datos. ":END
1940 IF erramsdos=&X01001000 THEN PRINT "Inserte un disco en la unidad y luego pulse una tecla.":WHILE INKEY$="":WEND:RESUME
1050 END