Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Elixir
Code

como manejar excepciones en elixir.

by
Length:MediumLanguages:

Spanish (Español) translation by Guillermo Bonell (you can also view the original English article)

el manejo de excepciones es una gran practica para la metodologia de cualquier desarrollador de software. ya sea para desarrollo basado en pruebas, rapidas corridas, o una sesion de hackeo con una buena lista de quehaceres, todos nos podemos beneficiar asegurando que nuestras bases estan cubiertas con un enfoque robusto para el manejo de defectos.

es primordial asegurarse que se esten corrigiendo los errores, mientras esten esteticamente agradables y porsupuesto no se convierta en un gran problema logico con mensajes encriptados para el usuario final intente entender que significa. si haces eso, estas ciertamente en la ruta de hacer una solida, estable y pegajosa app, los usuarios van a disfrutar trabajar con ella y la van a recomendar muchisimo a otros.

idealmente para nosotros, elixir provee muchas opciones para manejar las excepciones tales como  try/catch, throws. y el {:error, reason} tupla.

para hacer un error, usa raise en tu concha interactiva para tener una primera probada.

nosotros tambien podemos añadir un tipo a esto como:

como funciona el manejo de errores en elixir.

algunas de las formas en que se manejan los errores con Elixir puede no ser obvia a primera vista

  • primero acerca de procesos-- usando SPAWN, podemos crear procesos independientes. que significa, una falla en una amenaza no deberia afectar ningun otro proceso, amenos que haya una conexion de alguna forma. pero por defecto, todo se mantendra estable.
  • para notificar el sistema de una falla en uno de estos procesos, nosostros podemos usar el SPAWN_LINK macro. esto es un link bidireccional, lo que significa que si un proceso linkeado terminara, una señal de salida se va a disparar 
  • si la señal de salida no es otra cosa que :NORMAL, nosostros sabemos que tenemos un problema. y si estamos atrapados la señal de salida con Process.flag(:trap_exit, true), la señal de salida va a ser enviada al buzon de mensajes del proceso, donde la logica puede ser puesta en como manejar el mensaje, evitando un fuerte choque.
  • finalmente tenemos monitores, estos son parecidos a SPAWN_LINKS, pero estos son links unidireccionales, y podemos crearlos con Process.monitor.
  • el proceso que invoca el Process.monitor va a recivir los mensajes de errores en falla

para un error de prueba, traten de añadir un numero a un atomo y vas a obtener lo siguiente:

para asegurarse que el usuario final no le salgan errores, nosotros podemos usar el metodo :try, catch and rescue que provee elixir

Try/Rescue

primero en nuestra caja de herramientas para manejo de excepciones esta Try/Rescue, el cual atrapa errores producidos por usar RAISE por lo que es mejor para errores del desarrollador, o circunstancias exepcionales como un imput error.

try/rescue es parecido en la forma en como se usa a try/catch block you puede haber sido visto en otros lenguajes de programacion. vamos a ver un ejemplo en accion:

aca nosotros usamos el try/rescue bloqueado y el mencionado anteriormente RAISE para atrapar el RuntimeError

esto significa que el ** (RuntimeError) que genera RAISE no esta siendo mostrado, y que es reemplazado con un formato mas agradable generado de IO.puts.

como mejor practica, debes usar estos mensajes de error para dar una salida al usuario en simple ingles, lo que los ayuda con el problema. vamos a ver eso mas adelante en el proximo ejemplo:

multiples errores en un Try/Rescue

un gran beneficio de elixir es que tu puedes atrapar muchas salidas en uno de estos bloques Try/Rescue. mira este ejemplo:

aca hemos atrapado dos errores en el RESCUE.

  1. si el archivo no se puede leer
  2. si el simbolo :source_file esta faltando

como lo mencionamos antes, podemos usar esto para hacer mensajes de error faciles de entender para los usuarios.

este enfoque de sintaxis potente y minimo de elixir hace que sea muy accesible para nosotros chequear muchos posibles puntos de falla, de manera certera y concisa. esto nos ayuda a asegurar que no tenemos que escribir elaboradas condicionales haciendo textos largos que pueden ser dificiles de visualizar por completo y usarlo correctamente mas tarde en el final del desarrollo o para un nuevo desarrollador

como siempre cuando trabajas con elixir, KISS es el mejor acercamiento para agarrar.

despues

hay situaciones en las que vas a necesitar una accion especifica despues del bloque try/rescue, independientemente de si hubo algun error. para los desarrolladores de Java o PHP, deben estar pensando en el try/catch/finally o en Ruby's begin/rescue/ensure.

vamos a ver un ejemplo de usar AFTER.

aca ves el AFTER siendo usado para hacer constantemente un mensaje (o esto puede ser cualquier funcion que tu desees tirar ahi)

una practica mas comun es que encuentres estos usados en donde un archivo este siendo accesado, por ejemplo aqui:

arroja

tambien como el RAISE y TRY/CATCH, metodos que vimos anteriormente, tambien tenemos los macros de throw y catch

usando el metodo THROW existe una ejecucion con un valor especifico que podemos ver en nuestro bloque CATCH y usarlo despues asi:

entonces aca tenemos la habilidad para atrpar CATCH cualquier cosa que lancemos THROW dentro del bloque de prueba. en este caso, el condicional if x == 3 es el disparador para nuestro do: throw(x)

la salida de ka iteraccion producida por el loop nos da un claro entendimiento de que ha ocurrido en gramatica de programacion. aunado a eso hemos dado un paso al frente, y la ejecucion ya esta en el CATCH

debido a esta funcionalidad, aveces puede ser dificil ver donde el THROW CATCH sera implementado en tu app. un lugar principal puede ser en uso de una libreria donde el API no tenga un funcionamiento adecuado para todas las salidas presentadas al usuario, y un CATCH puede rapidamente navegar alrededor del problema, mejor que tener que desarrollar mucho mas en la libreria para manejar el problema y volver apropiadamente para el.

salidas

finalmente en nuestro arsenal de manejo de errores elixir tenemos el EXIT. salir esta hecho no atraves de la tienda de regalos, sino explicitamente en donde sea que muere un proceso 

las salidas estan señaladas como:

las señales de salida se disparan por procesos para una de las proximas tres razones:

  1. una salida normal: esto pasa cuando un proceso ha copmpletado su trabajo y termina la ejecucion. estas salidas son totalmente normales, normalmente no necesitas hacer nada cuando estas aparecen, parecido a exit(0) en C. la razon de salida para este tipo de salidas es el atomo :normal
  2. por problemas sin manejar: esto pasa cuando una uncaught exeption esta dentro del proceso, sin el bloque try/catch/rescuethrow/catch para que se encargue de eso
  3. forzadamente muerta: esto pasa cuando otro proceso manda una señal de salida con la razon :kill, lo que forza al proceso receptor a terminar

Trazas de pila

en cualquier actualizacion en throw, exit o errors, llamando al System.stacktrace esto retrocedera lo ultimo que acontecio en el actual proceso.

las trazas de pila pueden ser formadas bastante. pero esto es objeto de cambio en nuevas versiones de elixir. para mas informacion de esto, por favor refierance a la pagina de manual

para devolver las trazas de pila para el proceso actual, tu puedes usar lo siquiente:

haciendo tus propios errores.

si, elixir puede hacer eso tambien. por supuesto, tu siempre tienes tipos de built-in a tu disposicion como RuntimeError. pero no seria genial si pudieses ir un paso mas alla? 

crear tu propio tipo de error customizado es sencillo usando el macro defexception , el cual va a aceptar convenientemente la opcion :message, para establecer un mensaje de error por defecto:

aqui esta como usarlo en tu codigo:

Conclusión

error de manejo en un lenguaje meta-programming como elixir tiene un monton de implicaciones potenciales por como nosotros diseñemos nuestras aplicaciones y hacerlas lo suficientemente robustas para el rigor de el ambiente de produccion.

nosotros podemos asegurar que el usuario final siempre se queda con una pista-- un mensaje simple y sencillo de entender, que no hara su tarea dificil sino al contrario los mensajes de error siempre deben estar escritos en ingles sencillo y brindar mucha informacion. codigos encriptados de errores y nombres de variables no son buenas para usuario promedio, e incluso pueden confundir a los desarrolladores!

siguiendo adelante, puedes monitorear las excepciones que surgen en tu aplicacion elixir y crear un usuario especifico para ciertos sitios problematicos, de esta forma puedes panificar y analizar la forma de repararlo, o puedes ver usando una solucion off-the-shelf  

Servicios de terceros

mejora la punteria de nuestro trabajo de depuracion y habilida el monitoreo para la estabilidad de tu app con estos servicios de terceros disponibles para elixir:

  • AppSignal puede ser muy beneficioso para la calidad de garantia en el ciclo de desarrollo.
  • github repo bugsnex es un gran proyecto para usar la interfaz  API con Bugsnag para despues detectar defectos en tu elixir app.
  • monitorea el tiempo de actividad ,la RAM del sistema y errores con Honeybadger, el cual provee monitoreo de errores para que no tengas que cuidar tu app.

extendiendo la gestion de errores

yendo hacia adelante, desearas extender las capacidades de manejo de errores de tu app y hacer tu codigo mas facil de leer. para esto, yo recomiendo que revises este enlace project for elegant error handling on GitHub.

espero que hayas aprendido de esta guia y seas capaz de manejar practicamente cualquier excepcion que necesites en tu elixir app hora!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.