Anuncios

Bienvenidos sean a este post, a diferencia de C++ o Java el lenguaje C no ofrece un mecanismo de manejo de errores pero para aminorar esta dificultad Lua usa la aplicacion setjmp de C la cual resulta en un mecanismo similar al manejo de errores.

Anuncios

Todas las estructuras en Lua son dinamicas las cuales crecen lo necesario y con el tiempo se achica de nuevo cuando es posible, esto puede ocasionar que la posibilidad de una falla de localizacion de memoria es permanente en Lua, casi cualquier operacion podria enfrentar esta eventualidad, en lugar de usar codigos de error para cada operacion en la API Lua usa excepciones para señalar estos errores, esto significa que casi todas las funciones de API podrian lanzar un error (llama a longjump) en lugar de retornar.

Anuncios

Cuando escribimos codigo de libreria, funciones de C para ser llamada desde Lua, el uso de longjump es casi tan conveniente como la facilidad del manejo de excepciones porque Lua atrapa cualquier error ocasional, en cambio cuando escribimos codigo de aplicacion, codigo C que llama a Lua, debemos proveer una manera de atrapar a estos errores.

Anuncios

Manejando errores en codigo de aplicacion

Anuncios

Habitualmente tu codigo de aplicacion corre de forma desprotegida porque su codigo no es llamado por Lua ya que Lua no puede configurar un contexto apropiado para atrapar errores, no puede llamar a setjmp, en tales entornos cuando Lua enfrenta un error como “sin memoria suficiente” no hay mucho mas que hacer, se llama a una funcion de panico y, si la funcion retorna, sale de la aplicacion aunque tambien podemos setear nuestras propias funciones de panico con la funcion lua_atpanic.

Anuncios

No todas las funciones de la API lanza excepciones:

  • luaL_newstate
  • lua_load
  • lua_pcall
  • lua_close
Anuncios

Estas funciones son todas seguras ademas la mayoria de las otras funciones pueden lanzar una excepcion solo en caso de fallo de ubicacion de memoria, por ejemplo luaL_loadfile falla si no hay memoria suficiente por una copia del nombre del archivo, muchos programas no tiene mucho que hacer cuando se les acaba la memoria, asi que ellos deben poder ignorar estas excepciones, para estos programas si Lua se queda sin memoria estaria correcto entrar en panico. 😱

Anuncios

Si no quieres que tu aplicacion no salga incluso cuando ocurra una falla de ubicacion de memoria, vas a disponer de dos opciones:

  • la primera es setear una funcion de panico que no retorna a Lua, por ejemplo usando un longjmp para tu propio setjmp
  • la segunda es correr tu programa en modo protegido
Anuncios

La mayoria de las aplicaciones (incluyendo al interprete) corre codigo de Lua por la llamada de lua_pcall, por lo tanto habitualmente tu codigo se ejecutara en modo protegido, incluso en caso de falla de ubicacion de memoria, lua_pcall devuelve un codigo de error dejando al interprete en un estado consistente, si tambien quieres proteger todo tu codigo C que interactua con Lua puedes usar lua_cpcall, esta funcion es similar a lua_pcall pero toma como argumento la funcion de C para ser llamado, asi que no hay peligro de una falla de ubicacion de memoria mientras se empuja la funcion informada dentro de la pila.

Anuncios

Manejando errores con codigo de libreria

Anuncios

Lua es un lenguaje seguro, esto significa que no importa que escribas, no importa cuan mal este, siempre puedes entender la conducta de un programa en terminos de Lua mismo, ademas los errores son detectados y explicados en terminos de Lua tambien, se puede contrastar con C donde la conducta de muchos errores en el programa pueden ser explicados en terminos del hardware subyacente y donde las posiciones de error son dadas como un contador del programa.

Anuncios

Cuando agregas nuevas funciones de C a Lua pueden romper su seguridad, por ejemplo una funcion como poke (la cual almacena un byte arbitrario en una direccion de memoria arbitraria) pueden ocasionar todo tipo de corrupcion de memoria, debes esforzarte para asegurar que tus adiciones (add-ons) son seguras para Lua y provee un manejo de error.

Anuncios

Como dijimos anteriormente cada programa de C tiene su forma de manejar errores, cuando escribes una funciones de libreria para Lua hay una manera estandar para manejar errores, cuando una funcion de C detecta un error simplemente llama a lua_error, o mejor aun luaL_error la cual formatea un mensaje de error y luego llama a lua_error, la funcion lua_error limpia lo que sea necesario ser limpiado en Lua y vuelve a la lua_pcall que origino la excepcion, pasando el mensaje de error.

Anuncios

En resumen, hoy hemos visto como se puede manejar errores en la API C, como lo hace C, como lo hace Lua, como podemos hacerlo cuando un codigo C es llamado de Lua, cuando un codigo C llama a Lua, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00