콘텐츠로 이동

에러

분류와 재시도 메타데이터가 있는 구조화된 에러 처리. 전역 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