Ошибки
Структурированная обработка ошибок с категоризацией и метаданными retry. Глобальная таблица errors доступна без require.
Создание ошибок
Заголовок раздела «Создание ошибок»-- Простое сообщение (kind по умолчанию UNKNOWN)local err = errors.new("something went wrong")
-- С указанием kind, retryable и detailslocal 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() | string | Lua стек трейс |
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) endendПовторяемые ошибки
Заголовок раздела «Повторяемые ошибки»| Обычно повторяемые | Не повторяемые |
|---|---|
TIMEOUT | INVALID |
UNAVAILABLE | NOT_FOUND |
RATE_LIMITED | PERMISSION_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