archivo

Archivos Mensuales: octubre 2010

El término “manejo de errores” o “manejo de excepciones” hace referencia a una característica básica que debe tener cualquier lenguaje de programación moderno. Consiste básicamente en una estructura de control diseñada para tratar y gestionar de forma adecuada condiciones anormales en el flujo de un programa.

Nuestro querido SuperBASIC, a pesar de su antigüedad, dispone también de este tipo de construcciones incorporadas en el propio lenguaje.

La estructura básica que posee el SuperBASIC para el manejo de errores está formado por el comando WHEN ERROR el cual se apoya en otros comandos como RETRY, CONTINUE, ERNUM, ERLIN y REPORT. Con esta estructura podemos tratar de una forma más o menos limpia cualquier condición de error que suceda durante la ejecución de nuestro programa.

WHEN ERROR forma parte de SuperBASIC desde las versiones JS de la ROM en adelante. No funciona en las primeras versiones de la ROM del QL como las versiones FB, AH y JM. Para comprobar la versión de la ROM se puede usar los comandos PRINT VER$. Esto imprimirá un código de 2, 3 o 4 letras que indica la versión del SuperBASIC (o SBASIC si ustas utilizando el SMSQ). Los usuarios de Minerva obtendrán el código ‘JSL1’, mientras que los usuarios SMSQ obtendrán la salida ‘HBA’.

Hay algunos problemas menores con WHEN ERROR en las versiones JS y MG de SuperBASIC, pero es perfectamente usable.

La estructura básica para el manejo de errores se de define con una sentencia WHEN ERROR, y debe cerrarse con la sentencia END WHEN. Cualquier línea de código entre esas sentencias es ignorada hasta que ocurre un error. Cuando se produce un error en el flujo del programa entonces el bloque de código encerrado entre WHEN ERROR y END WHEN se ejecutará con el objetivo de tratar el error ocurrido.

Veamos un ejemplo muy simple.

100 WHEN ERRor
110   PRINT "Oops...! Ha ocurrido un error."
120 END WHEN
130 INPUT "Introduce un número > "; numero

Este programa te pedirá que introduzcas un número. Si escribimos cualquier texto o caracteres no numéricos, el programa imprimirá en pantalla la frase “Ooops…! Ha ocurrido un error.”, este sería nuestros “manejador de errores”. Este simple programa, en la práctica no sirve de mucho ya que no estamos solucionando nada, pero es el comienzo.

Las funciones ERNUM y ERLIN de SuperBASIC nos dirán el código de error y la línea donde se produjo el último error respectivamente. Por ejemplo, el siguiente código, nos mostrará estos datos.

100 WHEN ERRor
110   PRINT "Oops! Error ";ERNUM;' en la linea ';ERLIN
120 END WHEN
130 INPUT "Introduce un número > "; numero

El comando REPORT imprimirá el mensaje correspondiente al código de error que se ha producido. Si especificamos un número de canal, entonces el mensaje se imprimirá en la ventana que hayamos elegido.

100 WHEN ERRor
110   PRINT "Oops! Error ";ERNUM;' at line ';ERLIN
115   REPORT #1,ERNUM
120 END WHEN
130 INPUT "Enter a number > ';number

Si deseas desactivar el manejador de errores por cualquier razón en cualquier parte de su programa, sólo bastará definir una estructura WHEN ERROR vacía. Por ejemplo:

1000 REMark --- después de esto no habrá manejador de errores. 
1010 WHEN ERRor
1020 END WHEN

En la práctica, esto último no parece funcionar del todo bien en algunas versiones de la ROM.

Por último puedes añadir la sentencia CONTINUE o RETRY para especificar como debe actuar ante un error nuestro bloque de “controlador de errores”. CONTINUE indicará al programa que continúe la ejecución en la siguiente línea donde se produjo el error (en este caso nuestro programa deberá tomar previamente las medidas adecuadas). RETRY indicará a nuestro programa que vuelva a intentar la sentencia donde se produjo el error. Por ejemplo:

100 WHEN ERRor
110   REPORT ERNUM : PRINT #0, " en la línea. "; ERLIN;
120   PRINT #0, "¡Deberías fijarte bien!, número incorrecto."
130   RETRY
140 END WHEN
150 INPUT "Introduce el primer número > ";num1
160 INPUT "Introduce el segundo número > ";num2

Cuando ejecutes este programa y te pida que introduzcas el primer número, pulsa ENTER (es decir, una entrada en blanco). Esto causaría un error del tipo “error en expresión”, pero en nuestro caso, el controlador de errores te dirá que debes fijarte bien y volver a introducir un número. A continuación el programa volverá a intentar ejecutar la línea 150.

Con estos simples ejemplos hemos visto una forma muy limpia de tratar los errores con SuperBASIC de una manera estructurada, una característica avanzada en comparación a otros BASIC’s de la época.

—-
Fuente:
“ERROR TRAPPING” (David Denham). QL-Today
—-