コンテンツにスキップ

エラー

カテゴリ分けとリトライメタデータ付きの構造化エラー処理。グローバル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