Перейти к содержимому

Ошибки

Структурированная обработка ошибок с категоризацией и метаданными retry. Глобальная таблица errors доступна без require.

-- Простое сообщение (kind по умолчанию UNKNOWN)
local err = errors.new("something went wrong")
-- С указанием kind, retryable и details
local err = errors.new({
message = "user not found",
kind = errors.NOT_FOUND,
retryable = false,
details = {user_id = 123}
})

errors.new принимает либо строковое сообщение, либо таблицу с как минимум полем message. Форма (kind, message) не поддерживается.

Добавление контекста с сохранением kind, retryable и details:

local data, err = db.query("SELECT * FROM users")
if err then
return nil, errors.wrap(err, "failed to load users")
end
МетодВозвращаетОписание
err:kind()stringКатегория ошибки
err:message()stringСообщение ошибки
err:retryable()boolean/nilМожно ли повторить операцию
err:details()table/nilСтруктурированные метаданные
err:stack()stringLua стек трейс
tostring(err)stringПолное представление
if errors.is(err, errors.INVALID) then
-- обработать неверный ввод
end
-- Или сравнить напрямую
if err:kind() == errors.NOT_FOUND then
-- обработать отсутствующий ресурс
end
КонстантаПрименение
errors.NOT_FOUNDРесурс не существует
errors.ALREADY_EXISTSРесурс уже существует
errors.INVALIDНеверный ввод или аргументы
errors.PERMISSION_DENIEDДоступ запрещён
errors.UNAVAILABLEСервис временно недоступен
errors.INTERNALВнутренняя ошибка
errors.CANCELEDОперация была отменена
errors.CONFLICTКонфликт состояния ресурса
errors.TIMEOUTИстекло время операции
errors.RATE_LIMITEDСлишком много запросов
errors.UNKNOWNНеуказанная ошибка

Получение структурированного стека вызовов:

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
Обычно повторяемыеНе повторяемые
TIMEOUTINVALID
UNAVAILABLENOT_FOUND
RATE_LIMITEDPERMISSION_DENIED
ALREADY_EXISTS
if err:retryable() then
-- безопасно повторить
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