Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Entender a função assert
  2. Entender a função error
  3. Retornar erros
  4. Entender as funções pcall e xcall
  5. Entender o traceback

Assim como em toda linguagem, erros são consequências comuns quando estamos programando. Na linguagem Lua, podemos gerenciar erros utilizando as funções assert, error, pcall, xcall e também utilizando o traceback.

Com a função assert, podemos passar como argumentos expressões para serem validadas. Se o retorno for false, uma mensagem de erro será exibida e a execução de nosso programa será interrompida imediatamente sem que seja possível a recuperação.

Sintaxe
assert(condicao,mensagem_erro)
Exemplo 1
function funcao1(param)
  assert(type(a) == "string","parâmetro inválido.")
  print(param)
end
--passando parâmetro incorreto
funcao1(1)

Saída
lua5.3: Main.lua:2: parâmetro inválido.
stack traceback:
	[C]: in function 'assert'
	Main.lua:2: in function 'funcao1'
	Main.lua:7: in main chunk
	[C]: in ?

A função error tem a finalidade de encerrar nossos exibindo uma mensagem, que é passada como argumentos. Diferente da função assert, não possui argumento para receber uma condição para validação. Com a função error, nossos programas terão sua execução abortada.

Sintaxe
error(message,[,level])
Onde
message: mensagem de erro que desejamos exibir
level: Nível de chamada em que mensagem em ocorreu o erro. Opcional
Exemplo 2
function funcao1(param)
  error("erro desconhecido. O programa será abortado")
  print(param)
end
--passando parâmetro incorreto
funcao1(1)
Saída
lua5.3: erro desconhecido. O programa será abortado
stack traceback:
	[C]: in function 'error'
	Main.lua:4: in function 'funcao1'
	Main.lua:10: in main chunk
	[C]: in ?

Na linguagem Lua existe a possibilidade de executarmos uma função e verificar se ocorreu um erro ou não. Assim, de acordo com um retorno de um status, podemos fazer os devidos tratamentos. Essa possibilidade é obtida utilizando a função pcall e xpcall.

Sintaxe
status,valor_retorno = pcall(f,arg1,arg2, argN)
Retorno
status: true se não houver erro. false caso contrário.
valor_retorno: mensagem de erro ou valor retornado pela função
Exemplo 3
function funcao1(param)
  if(type(param) ~= "string") then
    error("funcao1: param com tipagem incorreta.")
  end
  return 10
end
--passando argumento errado
local status,retorno = pcall(funcao1,1)

if status == false then --houve erro
  print(retorno) 
else                    --não houve erro
  print("OK. Executou sem erro")
end
Saída
Main.lua:3: funcao1: param com tipagem incorreta

Com a função xpcall, temos a possibilidade de também passar uma função, para ser executada/testada como argumento. Além disso, podemos passar uma segunda função para lidar com erros caso estes ocorram.

Sintaxe
status,valor_retorno = pcall(f,arg1,arg2, argN)
Onde
status: true se não houver erro, false caso contrário.
valor_retorno: valor retornado pela função
Exemplo 3
function funcao1(param)
  if(type(param) ~= "string") then
    error("funcao1: param com tipagem incorreta.")
  end
  return 10
end

function funcao_erro(err) 
  print(err)
end
--passando argumento errado
local status,erro,retorno = pcall(funcao1,funcao_erro,1)

--imprimindo retornos
print(status) 
print(erro)
print(retorno)
Saída
false
Main.lua:3: funcao1: param com tipagem incorreta.
nil

O traceback é o local onde ficam armazenadas a pilha de chamadas das funções durante a execução de nossos programas. Quando um erro ocorre, o traceback pode ser exibido pelo interpretador de Lua.

Exemplo 4
function funcao1()
  funcao2()
end

function funcao2()
  funcao3()
end

function funcao3()
  print(a/0)
end
--recuperando função
funcao1()
Saída
lua5.3: Main.lua:10: attempt to perform arithmetic on a nil value (global 'a')
stack traceback:
	Main.lua:10: in function 'funcao3'
	Main.lua:6: in function 'funcao2'
	Main.lua:2: in function 'funcao1'
	Main.lua:13: in main chunk
	[C]: in ?

Para analisarmos a origem do erro, devemos analisar o backtrace iniciando na última linha até a primeira, pois a pilha de execuções é armazenada da forma LIFO(Last In, Firt Out).

Sintaxe
nome_modulo: numero_linha in descricao_chamada
Onde
nome_modulo: módulo inicial
numero_linha: número da linha da chamada de uma função 
descricao_chamada: descrição do erro ou chamada a uma função

No exemplo abaixo mostra o backtrace do exemplo 4 está ordem invertida as chamadas para exemplificar a ordem da leitura.

Exemplo 5
[C]: in ?
Main.lua:13: in main chunk
Main.lua:2: in function 'funcao1'
Main.lua:6: in function 'funcao2'
Main.lua:10: in function 'funcao3'
lua5.3: Main.lua:10: attempt to perform arithmetic on a nil value (global 'a')
  1. 12/09/2024 - revisão 3 - Ajuste gramatical em introdução, xpcall
  2. 30/08/2024 - revisão 2 - Correção em links de objetivos
  3. 03/10/2023 - revisão 1 - Correção em referências e erros gramaticais
  4. 26/05/2023 - versão inicial