English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
El manejo de errores durante la ejecución del programa es necesario, ya que durante las operaciones de archivo, la transferencia de datos y las llamadas a servicios web pueden ocurrir errores inesperados. Si no se presta atención al manejo de la información de error, se puede causar una filtración de información, el programa no puede ejecutarse, etc.
En cualquier lenguaje de programación, es necesario manejar errores. Los tipos de errores incluyen:
Error de sintaxis
Error de ejecución
Los errores de sintaxis suelen deberse a un uso inadecuado de los componentes del programa (como operadores, expresiones). Un ejemplo simple es el siguiente:
-- archivo test.lua a == 2
El resultado de la ejecución del código anterior es:
lua: test.lua:2: syntax error near '=='
Como puedes ver, se produjo un error de sintaxis, un "=" y dos "=" tienen diferencias. Un "=" es una expresión de asignación, dos "=" son operaciones de comparación.
Otro ejemplo:
for a= 1,10 print(a) fin
Ejecutar el programa anterior causará el siguiente error:
lua: test2.lua:2: 'do' expected near 'print'
Los errores de sintaxis son más simples que los errores de ejecución, los errores de ejecución no pueden ubicar el error específico, mientras que los errores de sintaxis se pueden resolver rápidamente, como en el ejemplo anterior, solo hay que agregar do debajo de la declaración for:
for a= 1,10 do print(a) fin
El error de ejecución es que el programa se puede ejecutar normalmente, pero generará información de error. A continuación se muestra un ejemplo en el que debido a la entrada de parámetros incorrectos, el programa generará un error al ejecutarse:
function add(a,b) return a+b fin add(10)
Cuando compilamos y ejecutamos el siguiente código, la compilación puede tener éxito, pero al ejecutarse, se producirá el siguiente error:
lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a value nil) rastro de pila: test2.lua:2: in function 'add' test2.lua:5: en el fragmento principal [C]: ?
en lua al llamar a una función, incluso si la lista de argumentos y la lista de parámetros no coinciden, se puede llamar con éxito, los argumentos adicionales se descartarán y los parámetros que faltan se completarán con nil.
El mensaje de error anterior se debe a que el parámetro b se completa con nil y nil participa en + operación.
supongamos add dentro de la función no es "return a+b" sino "print(a,b)" si es así, el resultado será "10 nil" No se generará un error.
Podemos usar dos funciones: assert y error para manejar errores. Ejemplo a continuación:
local function add(a,b) assert(type(a) == "number", "a no es un número") assert(type(b) == "number", "b no es un número") return a+b fin add(10)
Ejecutar el programa anterior causará el siguiente error:
lua: test.lua:3: b no es un número rastro de pila: [C]: in function 'assert' test.lua:3: in local 'add' test.lua:6: en el fragmento principal [C]: en ?
En el ejemplo, assert primero verifica el primer parámetro, si no hay problemas, assert no hace nada; de lo contrario, assert lanza un error con el segundo parámetro como información de error.
Formato de sintaxis:
error (message [, level])
Función: Terminar la función en ejecución y devolver el contenido del mensaje como información de error (la función error nunca regresará)
Generalmente, error adjunta información de ubicación de error al encabezado del mensaje.
El parámetro Level indica obtener la ubicación del error:
Level=1[Por defecto]: Para la ubicación de llamada a error (archivo+número de línea)
Level=2: Indica qué función llama a error
Level=0: No agregar información de ubicación de error
En Lua, se puede manejar errores utilizando la función pcall (llamada protegida) para encapsular el código que se debe ejecutar.
pcall recibe una función y los parámetros que se deben pasar a la función, y la ejecuta. El resultado de la ejecución es: hay error, no hay error; valor de retorno true o false, errorinfo.
Formato de sintaxis:
if pcall(function_name, ... ) then -- No hay errores else -- Algunos errores fin
Ejemplo simple:
> =pcall(function(i) print(i) end, 33) 33 true > =pcall(function(i) print(i) error('error..') end, 33) 33 false stdin:1: error..
Aquí preste atención al juicio lógico del valor de retorno:
> function f() return false,2 fin > if f() then print '1'else print '0' end 0
pcall llama al primer parámetro en un modo "protegido", por lo que puede capturar cualquier error que ocurra durante la ejecución de la función.
Generalmente, cuando ocurre un error, se desea obtener más información de depuración que solo la ubicación del error. Pero cuando pcall devuelve, ya ha destruido parte de la pila de llamadas.
Lua proporciona la función xpcall, que recibe como segundo parámetro una función de manejo de errores. Cuando ocurre un error, Lua llama a esta función antes de desplegar la pila de llamadas, permitiendo así obtener información adicional sobre el error utilizando la biblioteca debug.
La biblioteca debug proporciona dos funciones de manejo de errores genéricas:
debug.debug: proporciona un prompt de Lua para que el usuario revise la causa de los errores
debug.traceback: construye un mensaje de error ampliado basado en la pila de llamadas
>=xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33) 33 rastro de pila: stdin:1: en la función <stdin:1> [C]: en la función 'error' stdin:1: en la función <stdin:1> [C]: en la función 'xpcall' stdin:1: en el fragmento principal [C]: en ? falso nulo
Ejemplo de uso de xpcall 2:
función myfunction() n = n/nulo fin función myerrorhandler(err) print(«ERROR:», err) fin estado = xpcall(myfunction, myerrorhandler) print(estado)
Ejecutar el programa anterior causará el siguiente error:
ERROR:2.lua:2: intento de realizar una aritmética en el valor global 'n' (un valor nulo) falso