Latest web development tutorials

Lua Tratamento de erros

Programa de manipulação de erro correr é necessário, em nossa operações de arquivo, transferência de dados e serviço de web invocação aparecerá em erros inesperados. Se você não prestar atenção ao lidar com mensagens de erro, de acordo com a informação vai vazar, não pode ser executado e assim por diante.

Qualquer linguagem de programação, manipulação de erro é necessária. tipos de erro são:

  • Erro de sintaxe
  • Erro de tempo

Erro de sintaxe

Os erros de sintaxe são geralmente devido a componentes do programa (tais como operadores, expressões) causados ​​pelo uso indevido. Um exemplo simples é a seguinte:

-- test.lua 文件
a == 2

O código acima é executado como resultado de:

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

Como você pode ver, tem havido mais do que um erro de sintaxe, um sinal "=" seguido por dois sinal "=" é diferente. Um "=" representa a expressão de atribuição dois "=" representa a operação de comparação.

Outro exemplo:

for a= 1,10
   print(a)
end

O programa acima irá aparecer os seguintes erros:

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

Os erros de sintaxe é mais fácil do que correr um erro no programa, o erro executar incapaz de localizar os erros específicos, erros gramaticais que possamos resolver rapidamente, como os exemplos acima, desde que nós fazemos no para a declaração pode ser adicionado:

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

Erro de tempo

Execute o programa pode executar de erro é normal, mas irá imprimir uma mensagem de erro. Os seguintes exemplos porque os erros de entrada parâmetros, erro de execução do programa:

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

add(10)

Quando compilar e executar o código a seguir, o compilador pode ser bem sucedido, mas em tempo de execução irá produzir o seguinte erro:

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]: ?

A seguinte mensagem de erro é causado porque o programa não tem o parâmetro b.


Tratamento de erros

Podemos usar duas funções: assert e erro para manipular erros. Exemplos são os seguintes:

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

O programa acima irá aparecer os seguintes erros:

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 ?

Exemplo afirmar primeiro verifica o primeiro argumento, se não houver problema, afirmam não faz nada, caso contrário, o segundo argumento de afirmar mensagem de erro lançada.

função de erro

sintaxe:

error (message [, level])

: Termina a função a ser executada, e retorna o conteúdo da mensagem como a mensagem de erro (função de erro nunca mais voltará)

Normalmente, o erro será algumas informações adicionais sobre a mensagem de erro para a posição da cabeça.

parâmetro de nível indica a posição de errar:

  • Nível = 1 [padrão]: Para chamar erro (arquivo + número da linha)
  • Nível = 2: função que chama a função de erro indicada
  • Nível = 0: não adicionar localização do erro

pcall e xpcall, depurar

manipulação de erro Lua, você pode usar o pcall função (chamada protegida) para quebrar o código a ser executado.

pcall receber uma função e você quer passar um parâmetro do último, e executado, o resultado: há um erro, nenhum erro, ou o valor de retorno de verdadeiro ou falso, ErrorInfo.

Sintaxe é como se segue

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

Um exemplo simples:

> =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 em um "modo protegido" para chamar o primeiro argumento, portanto pcall função de captura pode executar quaisquer erros.

Normalmente, quando ocorre um erro, ele está esperando para acabar com mais informações de depuração, e não apenas onde ocorreu o erro. Mas retorna pcall, destruiu a parte do conteúdo da chamada Zhan.

Lua fornece xpcall função, xpcall receber um segundo parâmetro - um manipulador de erro quando ocorre um erro, manipulador de erro Lua será chamado antes de chamar show de Zhan para ver (relaxar), então você pode usar esta função na biblioteca de depuração para obter informações adicionais sobre o erro.

biblioteca de depuração fornece dois manipulador de erro genérica:

  • debug.debug: Lua fornecer uma solução rápida, permitindo que os usuários a se espalhar pelas razões erradas
  • debug.traceback: De acordo com a chamada Zhan para construir uma mensagem de erro estendido
> = Xpcall (função (i) impressão (i) erro ( 'erro ..') end, function () print (debug.traceback ()) end, 33) traceback 33 pilha: stdin: 1: na função [C]: em função de "erro" stdin: 1: na função [C]: em função 'xpcall' stdin: 1: no pedaço principal [C] :? Na falsa nil

Exemplo xpcall 2:

function myfunction ()
   n = n/nil
end

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

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

O programa acima irá aparecer os seguintes erros:

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