Pular para o conteúdo

Errors

Tratamento de erros estruturados com categorização e metadados de retry. Tabela global errors disponível sem require.

-- Mensagem simples (tipo padrão UNKNOWN)
local err = errors.new("something went wrong")
-- Com tipo, retryable e detalhes
local err = errors.new({
message = "user not found",
kind = errors.NOT_FOUND,
retryable = false,
details = {user_id = 123}
})

errors.new aceita uma mensagem string ou uma tabela com pelo menos um campo message. A forma (kind, message) não é suportada.

Adicionar contexto preservando tipo, retryable e detalhes:

local data, err = db.query("SELECT * FROM users")
if err then
return nil, errors.wrap(err, "failed to load users")
end
MétodoRetornaDescrição
err:kind()stringCategoria do erro
err:message()stringMensagem de erro
err:retryable()boolean/nilSe operação pode ser retentada
err:details()table/nilMetadados estruturados
err:stack()stringStack trace Lua
tostring(err)stringRepresentação completa
if errors.is(err, errors.INVALID) then
-- tratar entrada inválida
end
-- Ou comparar diretamente
if err:kind() == errors.NOT_FOUND then
-- tratar recurso ausente
end
ConstanteCaso de Uso
errors.NOT_FOUNDRecurso não existe
errors.ALREADY_EXISTSRecurso já existe
errors.INVALIDEntrada ou argumentos inválidos
errors.PERMISSION_DENIEDAcesso negado
errors.UNAVAILABLEServiço temporariamente fora
errors.INTERNALErro interno
errors.CANCELEDOperação foi cancelada
errors.CONFLICTConflito de estado de recurso
errors.TIMEOUTOperação expirou
errors.RATE_LIMITEDMuitas requisições
errors.UNKNOWNErro não específicado

Obter call stack estruturado:

local stack = errors.call_stack(err)
if stack then
print("Thread:", stack.thread)
for _, frame in ipairs(stack.frames) do
print(frame.source .. ":" .. frame.line, frame.name)
end
end
Tipicamente RetentávelNão Retentável
TIMEOUTINVALID
UNAVAILABLENOT_FOUND
RATE_LIMITEDPERMISSION_DENIED
ALREADY_EXISTS
if err:retryable() then
-- seguro para retentar
end
local err = errors.new({
message = "validation failed",
kind = errors.INVALID,
details = {
errors = {
{field = "email", message = "invalid format"},
{field = "age", message = "must be positive"}
}
}
})
local details = err:details()
for _, e in ipairs(details.errors) do
print(e.field, e.message)
end