Recientemente, tuve una conversación fascinante con un amigo que, como yo, es desarrollador de software. Estábamos discutiendo cómo los diferentes lenguajes de programación abordan los errores y eso generó algunos desacuerdos. Nos preguntamos qué métodos de manejo de errores funcionan mejor, cuáles son los pros y los contras e incluso si podríamos vivir sin excepciones. Esta conversación despertó mi curiosidad por explorar más profundamente el manejo de errores en varios lenguajes de programación y ahora estoy emocionado de compartir lo que he aprendido.
En mi trabajo diario, uso PHP y Golang, dos lenguajes con enfoques distintos para el manejo de errores. En este artículo, quiero llevarlos en un viaje en el que compararemos cómo estos lenguajes abordan los errores. ¡Pero hay más por descubrir! También exploraremos métodos alternativos de manejo de errores y descubriremos cuáles son los más adecuados para diferentes tareas. Entonces, prepárese para una interesante exploración del manejo de errores en el mundo de la codificación.
El manejo de errores en la programación es muy importante. Mirando hacia atrás, las formas en que hemos abordado los errores muestran cómo las necesidades y los desafíos de los desarrolladores han cambiado con el tiempo.
Inicialmente, las devoluciones de códigos de error eran dominantes. Estos resultados simples, a menudo basados en números enteros, indicaban éxito o tipos de error específicos. Si bien eran eficientes, su inconveniente era que a menudo saturaban el código y lo hacían menos legible. Para descifrar un error, había que consultar constantemente la documentación o las definiciones de los códigos de error.
Las excepciones surgieron como una solución más intuitiva: en lugar de devolver un código, el programa generaba una excepción cada vez que ocurría un error, lo que permitía al desarrollador detectarlo en una parte designada del código. Este enfoque fue adoptado por su claridad y la capacidad de centralizar el manejo de errores.
Poco después, las devoluciones de llamadas de error ganaron terreno, especialmente en entornos asincrónicos. La idea era sencilla: en lugar de esperar a que se produzca un error, ¿por qué no pasar una función (una devolución de llamada) para gestionarlo? El patrón onError(callback)
se hizo popular en JavaScript, haciendo que el manejo de errores sea más proactivo.
Algunos lenguajes de programación han introducido funciones especiales que le permiten trabajar con errores y excepciones. Por ejemplo, en LUA, existen error()
y pcall()
. Estos ofrecían una combinación de códigos de error tradicionales y mecanismos de excepción.
Paralelamente a los métodos para trabajar con errores descritos anteriormente, apareció un concepto como el de mónadas en los lenguajes de programación funcionales. Estos envuelven un valor en un contexto que indica éxito o fracaso, lo que permite un manejo de errores más expresivo y seguro. Aparte de eso, se pueden utilizar con otros patrones funcionales, lo que permite un manejo de errores y un encadenamiento de operaciones potente y conciso.
Pero centrémonos en PHP y Golang. PHP tiene amplias capacidades de manejo de errores. Antes de la versión 5.0, no había ninguna excepción en este lenguaje de programación. Los desarrolladores utilizaron una amplia variedad de métodos de manejo de errores, como la función trigger_error
, que genera un mensaje de error/advertencia/aviso a nivel de usuario; la función set_error_handler
, que le permite definir una devolución de llamada para el manejo de errores en el script, devolviendo activamente 'falso' o 'nulo' como resultado de una ejecución fallida de la función, etc.
Muchos de estos métodos todavía se utilizan ampliamente en el código PHP. Aún así, con la llegada de las excepciones y los lenguajes para manejarlas, han ganado gran popularidad entre los desarrolladores, ya que ofrecían una serie de ventajas sobre los métodos tradicionales de manejo de errores, por ejemplo, información más detallada sobre el error y dónde ocurrió, el capacidad para manejar errores de manera estructurada y legibilidad mejorada de código complejo.
Golang, por otro lado, trabaja con un patrón de retorno múltiple donde las funciones devuelven tanto un resultado como un error, enfatizando la verificación de errores explícita sobre el manejo de excepciones implícitas. Los creadores de Golang siguen el principio de que el lenguaje de programación debe ser lo más claro y sencillo posible. El objetivo principal de su diseño era proporcionar construcciones de lenguaje claras y eficientes para escribir código, especialmente en grandes organizaciones como Google. De esta manera, los desarrolladores podrían concentrarse en resolver problemas sin perder tiempo discutiendo sobre el estilo del código o tratando de darle sentido a un código complejo y confuso.
Como se señaló anteriormente, PHP tiene muchas capacidades de manejo de errores, pero las excepciones son el método más popular hoy en día. Si bien este enfoque es intuitivo y refleja muchos otros lenguajes de programación, puede conducir a estructuras anidadas, la situación en la que se trata de múltiples fuentes potenciales de error. Este anidamiento "try-catch" puede hacer que el código sea más difícil de leer, especialmente para los recién llegados. Analicémoslo.
VENTAJAS:
DESVENTAJAS:
Golang adopta un enfoque distinto. En lugar de excepciones, las funciones devuelven un valor de error junto con su valor de retorno normal. Entonces es responsabilidad del desarrollador verificar y manejar este error. Si bien esto puede hacer que el código Go sea más largo, ofrece una comprensión muy clara de cuándo y dónde pueden ocurrir errores.
VENTAJAS:
DESVENTAJAS:
El debate entre PHP y Golang a menudo se aventura en varios dominios de la programación, pero una de las áreas de discordia más importantes es su diferencia en rendimiento y consumo de recursos, especialmente cuando se trata de manejo de errores.
En el caso de PHP, las excepciones permiten la creación de un seguimiento de la pila, que ayuda a rastrear la secuencia de llamadas que conducen al error. Este seguimiento proporciona información valiosa para la depuración. Sin embargo, generar dicho rastro, especialmente en aplicaciones complejas, exige recursos computacionales y memoria. En consecuencia, cuando se lanzan excepciones con frecuencia, pueden ralentizar la aplicación y aumentar su huella de recursos.
Por otro lado, el método de Golang evita la sobrecarga de la creación de seguimiento de pila de excepciones. En cambio, las funciones devuelven valores de error que el programador debe verificar explícitamente. Este enfoque da como resultado un rendimiento más eficiente y un menor consumo de recursos. Pero sí transfiere la responsabilidad directamente a los hombros del desarrollador, lo que de alguna manera también consume muchos recursos.
La decisión entre usar el método basado en excepciones de PHP o el manejo explícito de errores de Golang no se trata solo de rendimiento y recursos, sino más bien de las compensaciones. Las excepciones proporcionan una gran cantidad de información de depuración, pero tienen un costo; El enfoque de Golang, a su vez, es amigable con los recursos pero requiere diligencia en la gestión de errores.
PHP, nacido de las necesidades del desarrollo web, priorizó la simplicidad y el alojamiento compartido. Su manejo de errores lo hace amigable para los desarrolladores de aplicaciones web. Por otro lado, Golang, creado por los gigantes del software Google, fue diseñado para la programación de sistemas modernos. Enfatiza el manejo explícito de errores utilizando múltiples valores de retorno: este paradigma promueve un flujo de código más claro y genera errores como valores regulares, ofreciendo un control más preciso.
Diferentes orígenes y objetivos dieron forma a sus filosofías de manejo de errores. PHP apuntaba a una amplia adopción entre los desarrolladores web, valorando la accesibilidad y la indulgencia. Por el contrario, Golang buscó rendimiento, claridad y robustez, ideales para sistemas escalables y mantenibles.
Sus enfoques inevitablemente suscitan un debate sobre la necesidad de excepciones.
Si bien la codificación sin excepciones puede parecer desalentadora, empuja a los desarrolladores hacia un código más transparente y predecible. Sin embargo, puede que no sea universalmente adecuado y resalta la necesidad de comprender intenciones y aplicaciones específicas del lenguaje.
En cuanto a mí, a pesar de las posibles desventajas de las excepciones, soy de esos desarrolladores que prefieren utilizarlas en su trabajo, si es posible. El enfoque de Golang me resulta menos cómodo, pero también me obliga a pensar más en lo que estoy haciendo y lo que quiero lograr. ¿Qué método te gusta usar más? ¡Me alegraré si compartes esta información en los comentarios!