Lua - Tratamento de Erros
Necessidade de tratamento de erros
O tratamento de erros é bastante crítico, pois as operações do mundo real geralmente exigem o uso de operações complexas, que incluem operações de arquivo, transações de banco de dados e chamadas de serviço da web.
Em qualquer programação, sempre há um requisito para tratamento de erros. Os erros podem ser de dois tipos, que incluem,
- Erros de sintaxe
- Erros de tempo de execução
Erros de sintaxe
Erros de sintaxe ocorrem devido ao uso impróprio de vários componentes do programa, como operadores e expressões. Um exemplo simples de erro de sintaxe é mostrado abaixo.
a == 2
Como você sabe, há uma diferença entre o uso de um único "igual a" e duplo "igual a". Usar um em vez do outro pode causar um erro. Um "igual a" refere-se à atribuição, enquanto um "igual a" duplo se refere à comparação. Da mesma forma, temos expressões e funções com suas formas predefinidas de implementação.
Outro exemplo de erro de sintaxe é mostrado abaixo -
for a= 1,10
print(a)
end
Quando executarmos o programa acima, obteremos a seguinte saída -
lua: test2.lua:2: 'do' expected near 'print'
Os erros de sintaxe são muito mais fáceis de manipular do que os erros de tempo de execução, pois o interpretador Lua localiza o erro de forma mais clara do que no caso de erro de tempo de execução. Desde o erro acima, podemos saber facilmente que a adição de um fazer declaração perante declaração de impressão é exigida de acordo com a estrutura Lua.
Erros de tempo de execução
No caso de erros de tempo de execução, o programa é executado com sucesso, mas pode resultar em erros de tempo de execução devido a erros na entrada ou funções mal tratadas. Um exemplo simples para mostrar o erro de tempo de execução é mostrado abaixo.
function add(a,b)
return a+b
end
add(10)
Quando construirmos o programa, ele será construído e executado com sucesso. Uma vez executado, mostra um erro de tempo de execução.
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]: ?
Este é um erro de tempo de execução, que ocorreu devido à não passagem de duas variáveis. ob parâmetro é esperado e aqui é nulo e produz um erro.
Funções de declaração e erro
Para lidar com erros, costumamos usar duas funções - assert e error. Um exemplo simples é mostrado abaixo.
local function add(a,b)
assert(type(a) == "number", "a is not a number")
assert(type(b) == "number", "b is not a number")
return a+b
end
add(10)
Quando executamos o programa acima, obteremos a seguinte saída de erro.
lua: test2.lua:3: b is not a number
stack traceback:
[C]: in function 'assert'
test2.lua:3: in function 'add'
test2.lua:6: in main chunk
[C]: ?
o error (message [, level])termina a última função protegida chamada e retorna a mensagem como a mensagem de erro. Este erro de função nunca retorna. Normalmente, o erro adiciona algumas informações sobre a posição do erro no início da mensagem. O argumento de nível especifica como obter a posição de erro. Com o nível 1 (o padrão), a posição de erro é onde a função de erro foi chamada. O nível 2 aponta o erro para onde a função que chamou o erro foi chamada; e assim por diante. A passagem de nível 0 evita a adição de informações de posição de erro à mensagem.
pcall e xpcall
Na programação Lua, para evitar o lançamento desses erros e o tratamento de erros, precisamos usar as funções pcall ou xpcall.
o pcall (f, arg1, ...)função chama a função solicitada no modo protegido. Se algum erro ocorrer na função f, ele não gerará um erro. Ele apenas retorna o status de erro. Um exemplo simples usando pcall é mostrado abaixo.
function myfunction ()
n = n/nil
end
if pcall(myfunction) then
print("Success")
else
print("Failure")
end
Quando executarmos o programa acima, obteremos a seguinte saída.
Failure
o xpcall (f, err)function chama a função solicitada e também define o manipulador de erros. Qualquer erro dentro de f não é propagado; em vez disso, xpcall detecta o erro, chama a função err com o objeto de erro original e retorna um código de status.
Um exemplo simples para xpcall é mostrado abaixo.
function myfunction ()
n = n/nil
end
function myerrorhandler( err )
print( "ERROR:", err )
end
status = xpcall( myfunction, myerrorhandler )
print( status)
Quando executarmos o programa acima, obteremos a seguinte saída.
ERROR: test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false
Como programador, é mais importante garantir que você cuide do tratamento de erros adequado nos programas que escreve. O uso de tratamento de erros pode garantir que condições inesperadas além das condições de limite sejam tratadas sem perturbar o usuário do programa.