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.