Errores
Errores
Sección titulada «Errores»Manejo de errores estructurados con categorizacion y metadatos de reintento. Tabla global errors disponible sin require.
Crear Errores
Sección titulada «Crear Errores»-- Mensaje simple (tipo por defecto UNKNOWN)local err = errors.new("something went wrong")
-- Con tipo, reintentable y detalleslocal 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.
Envolver Errores
Sección titulada «Envolver Errores»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")endMetodos de Error
Sección titulada «Metodos de Error»| Método | Devuelve | Descripción |
|---|---|---|
err:kind() | string | Categoria 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 | Representacion completa |
Verificar Tipo
Sección titulada «Verificar Tipo»if errors.is(err, errors.INVALID) then -- manejar entrada invalidaend
-- O comparar directamenteif err:kind() == errors.NOT_FOUND then -- manejar recurso faltanteendTipos de Error
Sección titulada «Tipos de Error»| Constante | Caso de Uso |
|---|---|
errors.NOT_FOUND | Recurso no existe |
errors.ALREADY_EXISTS | Recurso ya existe |
errors.INVALID | Entrada o argumentos invalidos |
errors.PERMISSION_DENIED | Acceso denegado |
errors.UNAVAILABLE | Servicio temporalmente caido |
errors.INTERNAL | Error interno |
errors.CANCELED | Operación cancelada |
errors.CONFLICT | Conflicto de estado de recurso |
errors.TIMEOUT | Operación agoto tiempo |
errors.RATE_LIMITED | Demasiadas solicitudes |
errors.UNKNOWN | Error no especificado |
Pila de Llamadas
Sección titulada «Pila de Llamadas»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) endendErrores Reintentables
Sección titulada «Errores Reintentables»| Tipicamente Reintentable | No Reintentable |
|---|---|
TIMEOUT | INVALID |
UNAVAILABLE | NOT_FOUND |
RATE_LIMITED | PERMISSION_DENIED |
ALREADY_EXISTS |
if err:retryable() then -- seguro para reintentarendDetalles de Error
Sección titulada «Detalles de 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