Este es un proyecto cancelado que no recibe actualizaciones. No obstante, puedes acceder a su archivo como referencia.

Versión Cero

POE: Programación Orientada a Errores

Sergio Montoro

El control de errores es un área de investigación continua en programación. Este artículo propone centrar la mejora de los lenguajes en el control de errores.

por Sergio Montoro Ten, 4 julio 05

Siempre he sentido curiosidad por saber cual será el próximo paradigma de programación. A uno siempre le gustaría anticiparse y aportar su granito de area. De modo que propongo una nueva filosofía llamada Programación Orientada a Errores. Está basada en algo muy simple: ¿qué porcentaje de código de un programa típico es control de errores? De hecho hubo que inventar las excepciones porque gran parte de la complejidad ciclomática de los programas era debida a la verificación de los valores de retorno de funciones.

La POE se basaría en tres principios:

1. Crear patrones de diseño para la creación y manejo de excepciones.
Nos hemos acostumbrado a que las excepciones son una forma de estructuras de control. Porque así es en Java, Ada, C++ y muchos otros lenguajes. Pero este no es el único modelo posible. Eiffel trata las excepciones más como condiciones verdaderamente anómalas e impredecibles. El principio básico de Eiffel es que una subrutina debe necesariamente tener éxito o fallar. Las excepciones se usan en Eiffel para señalizar que un procedimiento no cumplió con su contrato de servicio. Las excepciones no figuran en la signatura del método. Las excepciones se representan mediante cadenas o enteros y no existe una clase excepción.

2. Crear herramientas y/o lenguajes de programación que permitiesen separar el código de control del código de ejecución. Por ejemplo, ocultando selectivamente trozos de código para leer el resto con más claridad, etc.

3. Crear librerías estándar para generar logs y registros de auditoría.

Hay pues cuatro grandes áreas abiertas:

1. Cómo definir una política de creación de excepciones y su manejo.
Cuantas clases diferentes de excepciones es conveniente crear. Cuando deberían lanzarse. Que parte del programa debería ser responsable de su gestión.
Por ejemplo, en Java no existe una diferencia clara entre 3 tipos de excepciones: las que señalizan un fallo (puntero nulo), las que indican un resultado (fin de fichero) y las que monitorizan una condición (tamaño de fichero de entrada demasiado grande). En cambio Java sí distingue entre dos tipos de excepciones: las que deben ser necesariamente checkeadas y las que no.

2. Cerrar un estándar de pre-condiciones y post-condiciones.
Incluido dentro del lenguaje y sensible a si el programa está en modo debug o explotación.

3. Cómo crear ficheros de log.
Cómo ajustar la cantidad de mensajes que se vuelcan según su severidad. Cómo volcar los logs de ejecución de programas multi-hilo como un servidor web.

4. Cómo crear registros de auditoría útiles.
La auditoría es diferente de los logs. En los logs se busca conocer todos los detalles sobre la ejecución de un proceso. La auditoría consiste en saber qué usuario realizó que operaciones concretas de alto nivel y cuando.

Quienes no están familiarizados con el diseño de sistemas complejos tienden a diseñar medidas ad-hoc para recuperarse de excepciones. Es la tarea del buen arquitecto de sistemas discriminar los distintos tipos de situaciones anómalas y crear una política general de tratamiento. No es lo mismo que un usuario no pueda retirar dinero porque su saldo está a cero que tener caída la conexión con la base de datos.

Una posible táctica de diseño es identificar comunidades de riesgo. Una comunidad de riesgo es un conjunto de componentes a través de los cuales un error puede propagarse de forma transitiva.

Para mi, otro gran problema abierto es cómo cerrar los objetos que tienes abiertos en el caso de tener que salir de forma precipitada de un proceso. El caso clásico es liberar el comando SQL y cerrar la conexión si se produce un error mientras está recorriendo un recordset.

Si miramos un poco más hacia el futuro, las nuevas técnicas de computación distribuida (Grid) traen incluso nuevos desafíos derivados de controlar un errores asíncronos en componentes heterogéneos, remotos y distribuidos.

Comentarios
1 david
8 julio 2005, 12:03

En relacion al punto 2 que sugieres, en Java ya existe un mecanismo del lenguaje que puede utilizarse para verificar condiciones, los asserts. Ademas, como sugieres, se pueden configurar por linea de comandos dependiendo de si el programa este en debug o explotacion.

Tambien puede interesarte el paradigma Aspect Oriented Programming que esta relacionado con algunos de los temas que mencionas, aunque todavia esta por ver si AOP tiene futuro.
2 Sergio Montoro Ten
8 julio 2005, 14:35

Los asserts debieron meterlos en Java desde las primeras versiones.

AOP está muy relacionado con patrones de log y trazas, no es casualidad que uno de los primeros ejemplos de AOP es escribir trazas de los métodos que son llamados.
El problema de AOP, a mi juicio, es que, con los toolkits que hay ahora, no queda claro que al meter otra capa de software no introduzcas más complejidad de la que eliminas.

Lo que a mi me gustaría es que el entorno de desarrollo gestionase todo esto. Tener un botón que dijese “mostrar/ocultar código de depuración” y que hubiese una forma fácil y repetible de introducir el control de errores sin contaminar la elegancia del algoritmo original.
3 Alberto Molpeceres
9 julio 2005, 13:56

No sé Sergio, la verdad es que todo lo que comentas es, digamos, parte de lo que se podría llamar “higiene del código”. Me parece un poquito exagerado “presentarlo” como un nuevo paradigma (aunque sea una forma de hablar), pero bueno, tampoco es que me importe mucho eso.

Como comenta en parte David, básicamente lo que dices, todo, esta hecho en Java (y en otros lenguajes), algunas más tarde (asertos, logger), pero otras están ahí desde el principio (RuntimeException vs Exception). Quizás lo único “novedoso” podría ser la auditoria que comentas, dónde sin duda soluciones similares a AOP si que tendrían cabida, porque cualquier otro estándar es algo relativamente difícil para filtrar ese tipo de información (aunque sé de uno dónde es fácil, pero me lo callo).

El problema, y volviendo a lo mismo, no es si llegan antes o después, porque todo tiene su ritmo (también deberían haber traído climatronic todos los coches desde hace siglos), el problema viene de las personas, y que tienen que hacer cosas para las que no están preparadas. No conocen todo lo que se les ofrece para trabajar, no quieren aprenderlo, no saben como y cuando utilizarlo, y a partir de ahí, no se actualizan, con lo que la capacidad de la gente disminuye cada año para resolver problemas cuya complejidad aumenta cada día (ahora para hacer una web en java tienes que saber: ant, jsp, jstl, spring, jdo, tomcat, jsf, etc.).

El problema, al menos en lo que es gestión de errores, no viene de no disponer de herramientas, sino de lo mal que se hacen demasiadas cosas.
4 Alfredo
10 julio 2005, 16:28

Estoy de acuerdo en que el tratamiento correcto de los errores es uno de los principales retos a los que se enfrenta un programador/diseñador hoy en día. Y eso cuando le dejan enfrentarse porque los tiempos ajustados de desarrollo y el desconocimieto generalizado de los que dirigen los desarrollos nos llevan a un escenario donde se no le concede la importancia suficiente a este tema.

Conseguir que un proyecto cumpla con los requisitos en cuanto a funcionalidad es una cosa y dejar el proyecto cerrado con un control de errores adecuado otra muy distinta, en ocasiones lo segundo puede ser incluso más constoso en tiempo que lo primero. Pero el tiempo de los desarrollos sólo se marca atendiendo al costo de la primera parte obviando por lo general la segunda.

Coincido con alberto en que tenemos las herramientas pero se hacen las cosas muy mal, aunque no coincido en volcar toda la responsabilidad de los malos desarrollos sobre el desconocimiento del desarrollador, habría que tener en cuenta más factores como el desarrollo “fast food” en el que andamos inmersos hoy en día y la poca o nula atención que se presta al tema de tratamiento de errores en la formación de los desarrolladores, ya sea en la universitaria o cursos de la señorita pepis.

A nivel de lenguajes si que creo que “estamos servidos” y contamos con mecanismos suficientes para el correcto tratamiento de los errores. Lo que si seria importante es que los IDE’s intentarán facilitar la tarea de incluir esta gestión en el código. Un código lleno de estructuras try/catch, y llamadas a librerías de log se convierte en un código feo e ilegible. No sería dificil que los IDE’s proporcionarán varias vistas de una clase dada, una vista “exception” donde se vean los bloques try/catch y el resto del código aparezca visible pero no se pueda tocar, una vista “log” exactamente igual pero para los logs, otra vista que permita ver el código del algoritmo “limpio” de log’s y try/catch etc,etc.

Creo que el camino más que definir un nuevo paradigma pasa en primer lugar pasa por que se tome mayor conciencia de la importancia del tratamiento de errores y de producir software de calidad y en segundo lugar por que los IDE’s proporcionen herramientas para facilitar la tarea a los programadores.
5 elmaska
13 julio 2005, 10:54

Me uno a la corriente de los que han expresado que en lo más importante estamos ya servidos. Tenemos librerías y herramientas suficientes para solucionar las propuestas de Sergio en su paradigma.

Otra cosa es que sean demasiado simples para trabajos de determinados volumen y que su uso en ese tipo de trabajos haga que un código relativamente simple en cuanto a su lógica parezca un dump de CPU cuando se le introduce toda la gestión de errores y las trazas. En ese aspecto a veces hecho de menos (a nivel personal) los aparejos que se hacían en sus tiempos con el preprocesador de C o C++ y los “defines”.

En cuanto a la calidad del código que se desarrolla hoy en día creo que entre las causas podemos encontrar las siguientes:
1.- Falta de conciencia de los desarrolladores respecto a la importancia de su trabajo (quizá influya en algo la falta de motivación constante en este apasionante mundillo laboral).
2.- Falta de corrección y extensión en las definiciones de los sistemas (mal endémico que alguien a denominado “desarrollo fast food”).
3.- Mala gestión de la SQA. Todos hemos vivido “experiencias” con los ingenieros de calidad en las cuales nos hemos dado cuenta que hablamos lenguajes diferentes, tenemos objetivos diferentes y concepciones diferentes de lo que es y no es un sistema concreto. Y eso si se incluye dentro de la planificación del desarrollo las tareas pertinentes de calidad.
4.- Y ante todo falta de METODO (no añado el sufijo maldito para que no se genere polémica). Como decía mi abuelo: Cuando SABES hacer algo BIEN lo haces siempre IGUAL (de la misma forma).
6 cba
21 noviembre 2005, 16:31

Hola!

...y que te parecería Programación Orientada al Tiempo?

La posibilidad de programar sabiendo que en tal instante ocurrirá exactamente lo que quieres que ocurra. Que p.ej. cada 100 msgs el estado de una pixel se computa, y q cada 0.5 sgs. una variable tal será actualizada.

La idea sería algo así como…”no me muestres todas las cifras de pi cuando termines de calcularlas(pq puede que no termines nunca) sino que cada x tiempo muestrame las que tengas calculadas.

*No soy programador pero si un amago de visionario soñador ;)

1 saludo.


7 Guenher
3 diciembre 2005, 09:10

Deseo tener más información sobre Programación Basada en Errores


8 Oscar
3 diciembre 2005, 23:41

me encantaria contar com mucha mas informacion sobre POE


9 daniela stefanie
12 diciembre 2005, 22:27

hola amigo quisiera tener mas informacion de Programación Orientada a Errores,y si tubieras in formacion de progracion orientada a aspectos y eventos lo mas antes posible porfavor por q es para un trabajo en la uni te agradeceria mucho .A dios cuidate. DANIELA


10 Sergio Montoro Ten
12 diciembre 2005, 22:49

Para un mayor desarrollo del tema ver:

Exception Handling in Object Oriented Systems

y

Error Handling for Business Information Systems


11 staly
14 diciembre 2005, 23:36

necesito toda la informacion sobre programacion orientada a servicios y programacion basada en errores y en aspectos


12 Sergio Montoro Ten
14 diciembre 2005, 23:49

Otro artículo interesante sobre Aspectos puede encontrarse en Dependency injection with AspectJ and Spring


13 vanessa
26 febrero 2006, 01:41

quiero saber los conceptos de los errores de ejecucion de compilacion de logica


Acerca - Contacto - Información legal y técnica - Condiciones de uso - Noticias sobre el mundo del Desarrollo de Software.