Ir al contenido

Errores

Manejo de errores estructurados con categorizacion y metadatos de reintento. Tabla global errors disponible sin require.

-- Mensaje simple (tipo por defecto UNKNOWN)
local err = errors.new("something went wrong")
-- Con tipo, reintentable y detalles
local err = errors.new({
message = "user not found",
kind = errors.NOT_FOUND,
retryable = false,
details = {user_id = 123}
})

errors.new acepta un mensaje string o una tabla con al menos un campo message. La forma (kind, message) no está soportada.

Agregar contexto preservando tipo, reintentable y detalles:

local data, err = db.query("SELECT * FROM users")
if err then
return nil, errors.wrap(err, "failed to load users")
end
MétodoDevuelveDescripción
err:kind()stringCategoria de error
err:message()stringMensaje de error
err:retryable()boolean/nilSi la operación puede reintentarse
err:details()table/nilMetadatos estructurados
err:stack()stringTraza de pila Lua
tostring(err)stringRepresentacion completa
if errors.is(err, errors.INVALID) then
-- manejar entrada invalida
end
-- O comparar directamente
if err:kind() == errors.NOT_FOUND then
-- manejar recurso faltante
end
ConstanteCaso de Uso
errors.NOT_FOUNDRecurso no existe
errors.ALREADY_EXISTSRecurso ya existe
errors.INVALIDEntrada o argumentos invalidos
errors.PERMISSION_DENIEDAcceso denegado
errors.UNAVAILABLEServicio temporalmente caido
errors.INTERNALError interno
errors.CANCELEDOperación cancelada
errors.CONFLICTConflicto de estado de recurso
errors.TIMEOUTOperación agoto tiempo
errors.RATE_LIMITEDDemasiadas solicitudes
errors.UNKNOWNError no especificado

Obtener pila de llamadas estructurada:

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 ReintentableNo Reintentable
TIMEOUTINVALID
UNAVAILABLENOT_FOUND
RATE_LIMITEDPERMISSION_DENIED
ALREADY_EXISTS
if err:retryable() then
-- seguro para reintentar
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