エラー

グローバルな errors テーブルは、カテゴリ、詳細、再試行メタデータを持つ構造化エラーを作成し、検査します。require なしで利用できます。

このページはAPIリファレンスです。各コードブロックは独立したスニペットであり、完全なエントリではありません。err などの変数は周囲のアプリケーションコードから返されるか作成されたエラーを指します。ラップの例では、db がアプリケーションから提供されるデータベースクライアントであると想定しています。

エラーの作成

-- 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は文字列メッセージか、少なくともmessageフィールドを持つテーブルを受け付けます。(kind, message)形式はサポートされていません。

エラーのラップ

エラーをラップすると、kind、再試行メタデータ、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 完全な表現

Kindのチェック

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

エラー種別

定数 ユースケース
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 未指定のエラー

コールスタック

構造化されたコールスタックを調べるには、errors.call_stack を使用します。

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

再試行可能なエラー

再試行可能性はエラーのメタデータであり、エラー種別によって保証される特性ではありません。err:kind() から推測せず、err:retryable() の戻り値を確認してください。nil は、再試行が適切かどうかをエラーが指定していないことを意味します。

if err:retryable() then
    -- safe to retry
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