Documentation
¶
Overview ¶
Package errors provides custom error types for consistent error handling.
Error types: ValidationError, DatabaseError, ExternalAPIError, AuthenticationError, NotFoundError, ConflictError, RateLimitError, InternalError.
All types implement ErrorWithCode interface and support error wrapping.
The package has no dependency on any specific logging library. WriteHTTPError, WriteHTTPErrorHTML, and RecoveryMiddleware log through the Logger interface - pass an adapter for whatever logger the caller uses (see the zerologadapter subpackage for a zerolog adapter).
Index ¶
- func GetStackTrace(err error) []string
- func HTTPStatusCode(code ErrorCode) int
- func RecoveryMiddleware(logger Logger) func(http.Handler) http.Handler
- func UserMessage(err error) string
- func WriteHTTPError(w http.ResponseWriter, err error, logger Logger)
- func WriteHTTPErrorHTML(w http.ResponseWriter, err error, logger Logger)
- type AuthenticationError
- type BaseError
- type ConflictError
- type DatabaseError
- type ErrorCode
- type ErrorDetail
- type ErrorWithCode
- type ExternalAPIError
- type HTTPErrorResponse
- type InternalError
- type Level
- type Logger
- type NotFoundError
- type RateLimitError
- type ValidationError
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func GetStackTrace ¶
GetStackTrace extracts the stack trace from an error
func HTTPStatusCode ¶
HTTPStatusCode maps error codes to HTTP status codes
func RecoveryMiddleware ¶
Middleware for error recovery and logging
func UserMessage ¶ added in v0.1.1
UserMessage returns the safe, user-facing message for an error - the same sanitized text WriteHTTPError/WriteHTTPErrorHTML send (e.g. a wrapped database error's raw cause is never included), for callers that need to embed it in a custom response fragment instead of one of those two standard bodies.
func WriteHTTPError ¶
func WriteHTTPError(w http.ResponseWriter, err error, logger Logger)
WriteHTTPError writes a standardized error response to the HTTP response writer
func WriteHTTPErrorHTML ¶
func WriteHTTPErrorHTML(w http.ResponseWriter, err error, logger Logger)
WriteHTTPErrorHTML writes an HTML error response (for non-API endpoints)
Types ¶
type AuthenticationError ¶
type AuthenticationError struct {
BaseError
SessionID string
Reason string // "token_expired", "token_invalid", "permission_denied"
}
AuthenticationError represents authentication and authorization errors
func NewAuthenticationError ¶
func NewAuthenticationError(reason, message string) *AuthenticationError
NewAuthenticationError creates a new authentication error
type BaseError ¶
type BaseError struct {
// contains filtered or unexported fields
}
BaseError provides common error functionality
func (*BaseError) StackTrace ¶
StackTrace returns the captured stack trace
type ConflictError ¶
ConflictError represents resource conflict errors
func NewConflictError ¶
func NewConflictError(resourceType, conflictKey, message string) *ConflictError
NewConflictError creates a new conflict error
type DatabaseError ¶
type DatabaseError struct {
BaseError
Operation string // "query", "insert", "update", "delete", "transaction"
Query string
}
DatabaseError represents database operation errors
func NewDatabaseError ¶
func NewDatabaseError(operation, message string) *DatabaseError
NewDatabaseError creates a new database error
func WrapDatabaseError ¶
func WrapDatabaseError(err error, operation, query string) *DatabaseError
WrapDatabaseError wraps an existing error as a database error
type ErrorCode ¶
type ErrorCode string
ErrorCode represents application-specific error codes
const ( // Validation errors (1xxx) ErrCodeInvalidInput ErrorCode = "INVALID_INPUT" ErrCodeMissingRequired ErrorCode = "MISSING_REQUIRED" ErrCodeInvalidFormat ErrorCode = "INVALID_FORMAT" ErrCodeConstraintViolation ErrorCode = "CONSTRAINT_VIOLATION" // Database errors (2xxx) ErrCodeDatabaseConnection ErrorCode = "DB_CONNECTION" ErrCodeDatabaseQuery ErrorCode = "DB_QUERY" ErrCodeDatabaseTransaction ErrorCode = "DB_TRANSACTION" ErrCodeDatabaseMigration ErrorCode = "DB_MIGRATION" // External API errors (3xxx). The specific service is carried in // ExternalAPIError.Service, not encoded as a separate code per service. ErrCodeExternalAPI ErrorCode = "EXTERNAL_API_ERROR" // Authentication errors (4xxx) ErrCodeTokenExpired ErrorCode = "TOKEN_EXPIRED" ErrCodeTokenInvalid ErrorCode = "TOKEN_INVALID" ErrCodePermissionDenied ErrorCode = "PERMISSION_DENIED" // Resource errors (5xxx) ErrCodeNotFound ErrorCode = "NOT_FOUND" ErrCodeAlreadyExists ErrorCode = "ALREADY_EXISTS" ErrCodeResourceConflict ErrorCode = "RESOURCE_CONFLICT" // Rate limiting (6xxx) ErrCodeRateLimitExceeded ErrorCode = "RATE_LIMIT_EXCEEDED" ErrCodeQuotaExceeded ErrorCode = "QUOTA_EXCEEDED" // Internal errors (9xxx). RecoveryMiddleware reports recovered panics // as ErrCodeInternal too - there's no separate panic-specific code. ErrCodeInternal ErrorCode = "INTERNAL_ERROR" ErrCodeNotImplemented ErrorCode = "NOT_IMPLEMENTED" )
func GetErrorCode ¶
GetErrorCode extracts the error code from an error
type ErrorDetail ¶
type ErrorDetail struct {
Code ErrorCode `json:"code"`
Message string `json:"message"`
Details map[string]interface{} `json:"details,omitempty"`
}
ErrorDetail contains detailed error information for API responses
type ErrorWithCode ¶
ErrorWithCode interface for errors that have application-specific codes
type ExternalAPIError ¶
type ExternalAPIError struct {
BaseError
Service string // caller-defined service name, e.g. "yahoo", "nba_stats"
StatusCode int
URL string
RetryAfter *int // seconds to retry after; not set by the constructors, assign it directly when known
}
ExternalAPIError represents errors from external APIs
func NewExternalAPIError ¶
func NewExternalAPIError(service, message string, statusCode int, url string) *ExternalAPIError
NewExternalAPIError creates a new external API error
func WrapExternalAPIError ¶
func WrapExternalAPIError(err error, service, url string, statusCode int) *ExternalAPIError
WrapExternalAPIError wraps an existing error as an external API error
type HTTPErrorResponse ¶
type HTTPErrorResponse struct {
Error ErrorDetail `json:"error"`
}
HTTPErrorResponse represents a standardized HTTP error response
type InternalError ¶
InternalError represents unexpected internal errors
func NewInternalError ¶
func NewInternalError(component, message string) *InternalError
NewInternalError creates a new internal error
func WrapInternalError ¶
func WrapInternalError(err error, component, message string) *InternalError
WrapInternalError wraps an existing error as an internal error
type Logger ¶
type Logger interface {
// Log records msg at the given level. err may be nil (e.g. the panic
// path logs a message with no associated error). fields carries
// structured context (error_code, http_status, stack_trace, and
// error-type-specific keys like "field" or "resource_id").
Log(level Level, err error, fields map[string]interface{}, msg string)
}
Logger is the minimal structured-logging surface this package needs. It has no dependency on any specific logging library - wrap your logger to satisfy it. See the zerologadapter subpackage for a zerolog adapter.
type NotFoundError ¶
NotFoundError represents resource not found errors
func NewNotFoundError ¶
func NewNotFoundError(resourceType, resourceID string) *NotFoundError
NewNotFoundError creates a new not found error
type RateLimitError ¶
RateLimitError represents rate limiting errors
func NewRateLimitError ¶
func NewRateLimitError(service string, limit, retryAfter int) *RateLimitError
NewRateLimitError creates a new rate limit error
type ValidationError ¶
ValidationError represents input validation errors
func NewValidationError ¶
func NewValidationError(message string, field string, value interface{}) *ValidationError
NewValidationError creates a new validation error
func WrapValidationError ¶
func WrapValidationError(err error, message string, field string) *ValidationError
WrapValidationError wraps an existing error as a validation error
Directories
¶
| Path | Synopsis |
|---|---|
|
Package zerologadapter adapts a zerolog.Logger to the errors.Logger interface, so the parent package stays free of any logging-library dependency while callers can still log through zerolog.
|
Package zerologadapter adapts a zerolog.Logger to the errors.Logger interface, so the parent package stays free of any logging-library dependency while callers can still log through zerolog. |