Errores

La tabla global errors crea e inspecciona errores estructurados con categorías, detalles y metadatos de reintento. Está disponible sin require.

Esta es una referencia de API. Cada bloque de código es un fragmento aislado, no una entrada completa. Variables como err hacen referencia a un error devuelto o creado por el código circundante de la aplicación; el ejemplo de envoltura presupone que db es un cliente de base de datos proporcionado por la aplicación.

Creación de errores

-- Simple message (kind defaults to UNKNOWN)
local err = errors.new("something went wrong")

-- With kind, retryable, and details
local err = errors.new({
    message = "user not found",
    kind = errors.NOT_FOUND,
    retryable = false,
    details = {user_id = 123}
})

errors.new acepta un mensaje de cadena o una tabla con al menos un campo message. La forma (kind, message) no es compatible.

Envoltura de errores

Envuelve un error para añadir contexto conservando su clase, los metadatos de reintento y los detalles:

local data, err = db:query("SELECT * FROM users")
if err then
    return nil, errors.wrap(err, "failed to load users")
end

Métodos de error

Método Devuelve Descripción
err:kind() string Categoría de error
err:message() string Mensaje de error
err:retryable() boolean/nil Si la operación puede reintentarse
err:details() table/nil Metadatos estructurados
err:stack() string Traza de pila Lua
tostring(err) string Representación completa

Comprobación de la clase

if errors.is(err, errors.INVALID) then
    -- handle invalid input
end

-- Or compare directly
if err:kind() == errors.NOT_FOUND then
    -- handle missing resource
end

Clases de error

Constante Caso de uso
errors.NOT_FOUND El recurso no existe
errors.ALREADY_EXISTS Recurso ya existe
errors.INVALID Entrada o argumentos no válidos
errors.PERMISSION_DENIED Acceso denegado
errors.UNAVAILABLE Servicio temporalmente no disponible
errors.INTERNAL Error interno
errors.CANCELED Operación cancelada
errors.CONFLICT Conflicto de estado de recurso
errors.TIMEOUT La operación agotó el tiempo de espera
errors.RATE_LIMITED Demasiadas solicitudes
errors.UNKNOWN Error no especificado

Pila de llamadas

Usa errors.call_stack para inspeccionar una 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

Errores reintentables

La posibilidad de reintentar es un metadato del error, no una propiedad garantizada por su clase. Comprueba el valor devuelto por err:retryable() en lugar de inferirlo de err:kind(). Un resultado nil significa que el error no especifica si resulta apropiado volver a intentarlo.

if err:retryable() then
    -- safe to retry
end

Detalles del error

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