<aside>
🚨 에러 분류 · CrawlerError boundary · 재시도 / 회로 차단 · 구조화 로깅 · Prometheus 메트릭 · 알림 / 인시던트 대응 · 원본: .claude/rules/04-error-handling.md
</aside>
처음부터 모든 에러를 구조화하지 않고, layer 별로 분리:
// 일시적 — 재시도 가능
ErrCategoryNetwork "network"
ErrCategoryRateLimit "rate_limit"
ErrCategoryTimeout "timeout"
// 영구 — 재시도 무의미
ErrCategoryNotFound "not_found"
ErrCategoryForbidden "forbidden"
ErrCategoryParse "parse"
ErrCategoryValidation "validation"
// 시스템
ErrCategoryDatabase "database"
ErrCategoryQueue "queue"
ErrCategoryStorage "storage"
// 로직
ErrCategoryConfig "config"
ErrCategoryInternal "internal"
NET_001 Connection refused
NET_002 Connection timeout
NET_003 DNS resolution failed
HTTP_400 / 403 / 404 / 429 / 500 / 503
PARSE_001 Invalid HTML structure
PARSE_002 Missing required selector
PARSE_003 Encoding error
PARSE_004 Invalid JSON
VAL_001~005 Missing field / Invalid format / Too short / Too long / Quality threshold
DB_001~004 Connection / Query timeout / Constraint / Deadlock
QUEUE_001~003 Publish / Full / Malformed
EMB_001~003 API rate limited / Token limit / Model error