Manejo de Excepciones en Lua Por lo general, las aplicaciones de Lua no necesita manejar explícitamente las excepciones, puesto que Lua tiene una biblioteca que lo hace (lua_pcall), y esta biblioteca, cada vez que haya un error en la compilación o ejecución, el control del programa retornara a C, ¿por qué C ?, por que debido a que Lua es un lenguaje de extensión embebido, todas las acciones de Lua comienzan con código C en el programa anfitrión, y éste llama a la biblioteca lua_pcall. Pero si se desea, el usuario puede manejar de forma explicita los manejos de errores en su programa, para esto, se cuenta con 2 funciones, estas son: - La función error - La función pcall. Función Error Consiste en, añadir al comienzo del mensaje, cierta información acerca de la posición del error. El argumento nivel especifica cómo obtener la posición del error. Con nivel 1 (por defecto) la posición del error es donde fue invocada la función error. Nivel 2 apunta el error hacia el lugar en que fue invocada la función que llamó a error; y así sucesivamente. Pasar un valor 0 como nivel evita la adición de la información de la posición al mensaje. error(mensaje,[i]) -- i es el número del nivel del error Invocaremos una función llamada fun y usaremos la función error para el manejo de error: function fun () ... ... if (condicion inesperada) then error() end ... ... print(a[i]) -- error: `a' no es elemento de la tabla (a [i]) – ... ... end Función pcall Consta en que invoca una función con los argumentos dados en modo protegido. Esto significa que ningún error dentro de la función se propaga; en su lugar pcall captura el error y retorna un código de estatus. Su primer resultado es el código de estatus (booleano), el cual es verdadero si la llamada tiene éxito sin errores. En ese caso pcall también devuelve todos los resultados de la llamada después del primer resultado. En caso de error pcall retorna false más un mensaje de error. Cuando Lua se encuentra con cualquier error (tal como un error de asignación de memoria, un error de tipo, un error de sintaxis o un error de ejecución) entonces activa un error, esto es, realiza un salto largo en la memoria. pcall(función(args) … end) Este es un ejemplo general de cómo usar pcall de forma anónima: if pcall(function () ... end) then ... else ... Aquí, un ejemplo de la función pcall, lo cual se encapsulará el error. Para eso, tenemos que seguir ciertos pasos. - La función pcall, se encargará de “encapsular” el error. f pcall(foo) then -- no hay errors en la funcción `foo' ... else -- `foo' tiene errors, tomar acciones. ... end