HP Prime - Programación con errores [IFERR]

IFERR es una estructura para la captura de errores, permitiendo reutilizar el número de error para su tratamiento. HP Prime reconoce automáticamente muchas condiciones como errores en programas, esto se aprovecha de múltiples formas al programar.


Programando con errores: tratamiento y utilidades
IFERR - HP Prime

Sabiendo que la palabra "Error" no es bien recibida al momento de crear nuestros programas, se debe saber también que hay formas de aprovechar estos eventos con una estructura que capture el error (IFERR); en ese sentido el error llega a ser un dato más para programar, bajo ciertos criterios nos ayuda de muchas formas como simplificar el código o hacer más rápida la ejecución de un bloque de nuestro programa.


El error en HP Prime

Tal como la ayuda lo indica, muchas condiciones se reconocen automáticamente como errores al momento de programar, errores como Error de sintaxis, Entrada no válida, Memoria insuficiente, Unidades incoherentes, Programa interrumpido, etc.

Los tipos de errores son muy diversos, la mayoría se relaciona al tratamiento de errores, también existen algunos que pueden ser aprovechados, esto se verá más adelante. En programación los errores se clasifican en 3 tipos, quienes para la calculadora serían redifinidos de la siguinte forma.

Errores de sintaxis
En la calculadora este tipo de errores engloba los errores de compilador junto a errores al validar los datos ingresados en la vista de Inicio, CAS y demás medios de entrada de datos. Los errores de este tipo se presentan cuando el programa no respeta la sintaxis del lenguaje o de los comandos mostrados en el manual de usuario, por tanto las instrucciones no llegan a ejecutarse (se queda en la fase de validación), errores como usar variables no declaradas o funciones que aún no fueron definidas, la ausencia de un ";",  la omisión de END, carencia o exceso de paréntesis, nombres mal escritos, etc.
Ejemplos: Error: error de sintaxis, Error: dos comas en la entrada, Error: exp. no válido en el núm., Error: número sin dígitos signif., etc.

Nota adicional: Debido al uso del Comando EXPR( ) es posible que ocurran errores de sintaxis incluso en tiempo de ejecución, ya que este comando adiciona código (por lo cual incluye una fase de validación).

Errores de ejecución
En términos generales, un error de este tipo es aquel que se ocasiona cuando el programa se encuentra en ejecución (por lo tanto no existe errores de sintaxis), errores como acceder a una posición no existente de una lista, exceso de parámetros, sumar listas de tamaños distintos, dividir un número sobre 0, sobrepasar algún Límite de dato (lista, matriz y cadena).
Ejemplos: Error: entrada no válida, Error: tipo de argum. incorrecto, Error: rec. de argum. incorrecto, Error: unidades incoherentes, Error: X/0, Error: 0/0, etc.

Errores semánticos (o de diseño)
Estos son los más complejos, puesto que estan relacionados al programador, una falla de su algoritmo por no realizar lo que espera, ya sea por una instrucción mal escrita o por la falta de una o más sentencias, por esa razón no hay programa que pueda identificar la fuente de estos errores, ya que el programa esta haciendo exactamente lo que se le ha indicado, así que obtener datos incorrectos no significará una falla para la calculadora. Por tanto estos casos no son considerados como errores por la calculadora o por algún otro lenguaje.

En HP Prime es interesante cómo todos los errores pueden ser captados con IFERR, no significando que al ocurrir un error el programa deba ser cerrado, en términos generales de la programación, el error es algo común que en muchas ocasiones escapa de nuestras manos. Así que hay que perder el temor de que ocurran a lo largo del programa, siempre y cuando sepamos que van a ocurrir, no es nada más que un estado que podemos aprovechar y de esa forma hacer la programación más sencilla (en algunas ocasiones).


Estructura de captura del error - IFERR | Ans

Al igual que una estructura de control IF, el IFERR (if error) recibe un argumento tipo bloque, si comandos1 ocasiona un error, entonces ejecuta comandos2, adicionalmente si no ocurre error ejecuta comandos3 (similar a una acción terminal si es que no ocurre un error). Todos los Comandos# mencionados pueden ser múltiples instrucciones.



En el bloque THEN (entonces) es posible usar la variable Ans, ya que en esa variable se almacenará el número de error ocurrido, este sirve para identificar su tipo, la variable Ans mencionada es la misma que se usa en la vista de Inicio así que es de esperar que será modificada.




Número de error

Una buena noticia es que el número almacenado en Ans sigue el orden dado por STRINGFROMID, se puede observar que muchos de ellos provienen de la vista CAS.


De acuerdo a lo mostrado si se necesitara mostrar el equivalente en cadena del error, se puede hacer adicionando 654 para el ID de la cadena integrada, apto para los errores del 0 al 68 (se desconoce el número de los errores siguientes).





No es posible mostrar el típico formato de error con el círculo rojo y la X, no hay una opción editable del MSGBOX hasta ahora que adicione íconos, esta restricción no es relevante al programar normalmente, por lo menos se puede usar la cadena equivalente.


Tratamiento de errores

Manejo o tratamiento de errores es un tema muy popular y a la vez simple, consta de responder ante la presencia de algún tipo de error (denominado excepción en otros lenguajes), usualmente es para atender errores en tiempo de ejecución, pero como se había mencionado también se podrá capturar errores de compilación.

La buena práctica indica atender cada error por separado, haciendo que el programa reaccione específicamente para cada error, para ello podemos usar una estructura CASE.



Pero como en HP Prime todo es sencillo (es extraño que algo sea complejo), puede bastar atender de forma general el error; son pocos los casos donde es necesario identificar la fuente, como el caso de identificar un error generado por la tecla ON.



En HP Prime existen casos donde un comando retorna 0 cuando no logra ejecutar una acción, como AFilesB, DelAVars y otros, es por ello que HP PPL es muy amigable.


Los errores a favor

Depuración de programas

La Depuración de programas en HP Prime no es un punto fuerte, una alternativa para tal objetivo es capturar los datos que generan el error, para ello debemos poner dentro de un IFERR la parte del código que tiene la falla (tratar el error), y mostrar con algún medio los datos a observar.



Usando el comando MSGBOX como medio de visualización de datos, notamos que el error es b, por lo tanto la corrección debe centrarse en el resultado esperado por Funcion_Propia.



Si bien es cierto, podemos mostrar los datos que necesitemos con MSGBOX en muchas partes del código para observar los datos, pero es más ventajoso usar IFERR ya que solo ejecutará la instrucción si existe algún problema.

Recordar que es más adecuado probar los algoritmos de forma independiente para verificar que funcionen correctamente (para programas extensos), los errores a corregir deberían ser los que se presenten al interactuar entre todo el código y en partes que no se posible probarlos independientemente.

Consumo de la estructura IFERR

Las instrucciones dentro de la estructura IFERR se ejecutan a una velocidad normal, es muy similar a un IF simple, a diferencia que no realiza una verificación previa (el valor booleano de control) y eso lo hace aún más rápido que este último. Es muy aconsejable usarlo fuera de las estructuras tipo bucle, de esta manera se consigue optimizar el código.

Datos desconocidos

Cuando no hay forma de evitar un error por carencia de un comando que nos permita obtener un dato como el final de una lista o un caso que se escapa de lo programable, usar IFERR resulta adecuado.

Por ejemplo el caso de STRINGFROMID, no existe comando que nos indique la cantidad de cadenas integradas, actualmente son 2996 (FW 11456), pero nada nos asegura que esta lista aumente en versiones futuras, por lo tanto este sería un buen caso para visualizar todas las cadenas (además de poseer el tiempo para ello).



Simplificación de condicionales

La simplificación de condicionales es realmente útil cuando su repetición contínua es la base de la demora de nuestro programa (bucle de procesamiento), ya sea para juegos, cálculo estructural, procesamiento de imagen, procesamiento de texto, etc. En los bucles de procesamiento es importante la optimización del código ya que pueden ser segundos de diferencia.

Aunque el siguiente ejemplo puede ser reemplazado con EXECON, la finalidad es mostrar la aplicación de este concepto. Si se tienen 3 listas de tamaño desconocido, de las cuales se quiere obtener 3 grupos de datos si es posible, considerando que el inicio de captura de dato es variable para cada lista, de no cumplir las condiciones retornar lista vacía; se presenta un algoritmo propuesta que logra cumplir el enunciado.



El resultado esperado es {{−1,26,12},{10,81,1}} y la propuesta lo cumple perfectamente, se colocó de forma independiente las estructuras IF para ejemplarizar los casos reales que pueden existir (en caso que las pruebas se hagan obligatoriamente una después de otra).

La propuesta con una estructura IFERR se reduce notablemente, por lo tanto es más eficiente (es importante cuando el bucle hace miles de ciclos).





Conservación de datos en programas

Para la Conservación de datos en programas cumple un rol muy importante, tratar el llamado de una variable, si esta no existe y falla se procede a crear la variable con datos iniciales, sino no se hace nada. Para determinar si una variable existe se debe usar el comando EXPR, pues se asume que al no existir externamente no se podría compilar el código, por lo tanto esta variable de respaldo de datos será usado con el comando EXPR, HVars o el que sea necesario, tampoco se recomienda usarlo con frecuencia en el código, sólo para cargar y guardar los datos al entrar y salir del programa respectivamente.





Sin embargo estos valores corren el riesgo de ser manipulados por usuarios curiosos, por lo tanto luego del cargado de datos es posible que ocurra un error o tener datos fuera de los límites del programa; cuando el programa es complejo y se requiere almacenar datos importantes, es preferible usar variables de aplicación e incluso archivos.


Aclaraciones y consejos finales

Los beneficios de los errores se enfocan en lograr la sencillez del algoritmo y la optimización del programa (velocidad y batería).

Es mejor validar nuestros datos a través de condicionales (lo usual) en vez de tratarlos luego de que halla fallado una instrucción, no confundir la capacidad del comando IFERR como un corrector de todos nuestro problemas, debe usarse sólo cuando sea necesario.

Es adecuado realizar un tratamiento de error localizado para cada necesidad, englobar una cantidad grande de código (más de 10 líneas tal vez) con una estructura de captura de error es considerado una mala práctica.

Al momento de programar es importante observar que el programa falle, por esa razón no es beneficioso colocar estructuras IFERR generales (por ejemplo para el control de la tecla ON) hasta lograr corregir todos los errores del programa.

Comentarios

Lo más visto