Latest web development tutorials

Lua tratamiento de errores

Programa de control de errores de gestión es necesario, en nuestra operaciones de archivos, transferencia de datos y la invocación de servicios web aparecerá en los errores inesperados. Si no se presta atención para hacer frente a los mensajes de error, de acuerdo con la información se escape, no se puede ejecutar y así sucesivamente.

Cualquier lenguaje de programación, se requiere el manejo de errores. Tipos de error son:

  • Error de sintaxis
  • Error de tiempo de ejecución

Error de sintaxis

Los errores de sintaxis son por lo general debido a los componentes del programa (por ejemplo, operadores, expresiones) causados ​​por un uso indebido. Un ejemplo simple es el siguiente:

-- test.lua 文件
a == 2

El código de seguridad se ejecuta como resultado de:

lua: test.lua:2: syntax error near '=='

Como se puede ver, se han producido más de un error de sintaxis, un signo "=" seguido de dos signo "=" es diferente. Un "=" es la expresión de asignación dos "=" es la operación de comparación.

Otro ejemplo:

for a= 1,10
   print(a)
end

El programa anterior aparecerá los siguientes errores:

lua: test2.lua:2: 'do' expected near 'print'

Los errores de sintaxis es más fácil que la ejecución de un programa de error, el error de gestión no puede localizar los errores específicos, errores gramaticales que podemos resolver con rapidez, como los ejemplos anteriores, siempre y cuando lo hacemos en la sentencia for se puede añadir:

for a= 1,10
do
   print(a)
end

Error de tiempo de ejecución

Ejecutar el programa puede realizar error es normal, pero emite un aviso de error. Los siguientes ejemplos porque los errores de entrada de parámetros, error de ejecución del programa:

function add(a,b)
   return a+b
end

add(10)

Cuando compilar y ejecutar el siguiente código, el compilador puede tener éxito, pero en tiempo de ejecución producirá el error siguiente:

lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value)
stack traceback:
	test2.lua:2: in function 'add'
	test2.lua:5: in main chunk
	[C]: ?

El mensaje de error se produce porque el programa carece del parámetro b.


Control de errores

Podemos utilizar dos funciones: aserción y error para controlar los errores. Ejemplos son los siguientes:

local function add(a,b)
   assert(type(a) == "number", "a 不是一个数字")
   assert(type(b) == "number", "b 不是一个数字")
   return a+b
end
add(10)

El programa anterior aparecerá los siguientes errores:

lua: test.lua:3: b 不是一个数字
stack traceback:
	[C]: in function 'assert'
	test.lua:3: in local 'add'
	test.lua:6: in main chunk
	[C]: in ?

Ejemplo afirmar comprueba en primer lugar el primer argumento, si no hay problema, afirman no hace nada, de lo contrario, el segundo argumento como para afirmar mensaje de error arrojado.

función de error

sintaxis:

error (message [, level])

: Termina la función que se está ejecutando, y devuelve el contenido del mensaje como el mensaje de error (función de error no volverá)

Por lo general, el error será alguna información adicional acerca del mensaje de error a la posición de la cabeza.

parámetro de nivel indica la posición de conseguir equivocado:

  • Nivel 1 = [predeterminado]: Para llamar a error (archivo + número de línea)
  • Nivel = 2: función que llama a la función de error se indica
  • Nivel = 0: no agregue la ubicación de error

pcall y xpcall, depuración

gestión de errores Lua, puede utilizar la función de pcall (llamada protegida) para envolver el código a ser ejecutado.

pcall recibir una función y quiere pasar un parámetro de este último, y ejecutado, el resultado: hay un error, no hay error, o el valor de retorno de la verdadera o falsa, errorInfo.

Sintaxis es la siguiente

if pcall(function_name, ….) then
-- 没有错误
else
-- 一些错误
end

Un simple ejemplo:

> =pcall(function(i) print(i) end, 33)
33
true
   
> =pcall(function(i) print(i) error('error..') end, 33)
33
false        stdin:1: error..
> function f() return false,2 end
> if f() then print '1' else print '0' end
0

pcall en un "modo protegido" para llamar al primer argumento, por lo tanto, pcall función de captura puede realizar cualquier error.

Normalmente, cuando se produce un error, que es la esperanza de terminar con más información de depuración, no sólo donde se produjo el error. Pero vuelve PCALL, que ha destruido parte de los contenidos de la llamada Zhan.

Lua ofrece xpcall función, xpcall recibir un segundo parámetro - un gestor de errores cuando se produce un error, controlador de errores Lua será llamado antes de llamar espectáculo para ver Zhan (descansar), a continuación, puede utilizar esta función en la biblioteca de depuración para obtener información adicional sobre el error.

biblioteca de depuración proporciona dos controlador de error genérico:

  • debug.debug: Lua proporcionar un aviso, lo que permite a los usuarios distribuir las razones equivocadas
  • debug.traceback: De acuerdo a la llamada Zhan para construir un mensaje de error extendido
> = Xpcall (function (i) de impresión (i) error ( "error .. ') final, función print ())) final (debug.traceback (, 33) 33 de rastreo de pila: la entrada estándar: 1: en la función [C]: en función de "error" la entrada estándar: 1: en la función [C]: en la función 'xpcall' entrada estándar: 1: en el trozo principal [C] :? En nula falsa

Ejemplo xpcall 2:

function myfunction ()
   n = n/nil
end

function myerrorhandler( err )
   print( "ERROR:", err )
end

status = xpcall( myfunction, myerrorhandler )
print( status)

El programa anterior aparecerá los siguientes errores:

ERROR:	test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false