Documentation
¶
Overview ¶
Package derp provides a standardized way to create and manage errors in Go applications.
Index ¶
- func Details(err error) []any
- func ErrorCode(err error) int
- func IsBadRequest(err error) bool
- func IsClientError(err error) bool
- func IsForbidden(err error) bool
- func IsGone(err error) bool
- func IsInformational(err error) bool
- func IsInternalServerError(err error) bool
- func IsMisdirectedRequest(err error) bool
- func IsNil(err error) bool
- func IsNotFound(err error) bool
- func IsNotFoundOrGone(err error) bool
- func IsNotImplemented(err error) bool
- func IsRedirection(err error) bool
- func IsServerError(err error) bool
- func IsSuccess(err error) bool
- func IsTeapot(err error) bool
- func IsTooManyRequests(err error) (bool, time.Duration)
- func IsUnauthorized(err error) bool
- func IsValidationError(err error) bool
- func Location(err error) string
- func Message(err error) string
- func NotNil(err error) bool
- func Report(err error)
- func ReportAndReturn(err error) error
- func ReportFunc(fn func() error)
- func RetryAfter(err error) time.Duration
- func RootCause(err error) error
- func RootLocation(err error) string
- func RootMessage(err error) string
- func Serialize(err error) string
- func URL(err error) string
- func Unwrap(err error) error
- func Wrap(inner error, location string, message string, details ...any) error
- func WrapIF(inner error, location string, message string, details ...any) error
- type DetailsGetter
- type Error
- func AsError(err error) Error
- func BadRequest(location string, message string, details ...any) Error
- func BadRequestError(location string, message string, details ...any) Error
- func Forbidden(location string, message string, details ...any) Error
- func ForbiddenError(location string, message string, details ...any) Error
- func Gone(location string, message string, details ...any) Error
- func Internal(location string, message string, details ...any) Error
- func InternalError(location string, message string, details ...any) Error
- func MisdirectedRequest(location string, message string, details ...any) Error
- func MisdirectedRequestError(location string, message string, details ...any) Error
- func NotFound(location string, message string, details ...any) Error
- func NotFoundError(location string, message string, details ...any) Error
- func NotImplemented(location string, details ...any) Error
- func NotImplementedError(location string, details ...any) Error
- func Teapot(location string, message string, details ...any) Error
- func TeapotError(location string, message string, details ...any) Error
- func Timeout(location string, message string, details ...any) Error
- func TimeoutError(location string, message string, details ...any) Error
- func Unauthorized(location string, message string, details ...any) Error
- func UnauthorizedError(location string, message string, details ...any) Error
- func Validation(message string, details ...any) Error
- func ValidationError(message string, details ...any) Error
- func (err Error) Error() string
- func (err Error) GetDetails() []any
- func (err Error) GetErrorCode() int
- func (err Error) GetLocation() string
- func (err Error) GetMessage() string
- func (err Error) GetRetryAfter() time.Duration
- func (err Error) GetTimeStamp() int64
- func (err Error) GetURL() string
- func (err Error) IsZero() bool
- func (err Error) Unwrap() error
- type ErrorCodeGetter
- type HTTPError
- type HTTPRequestReport
- type HTTPResponseReport
- type LocationGetter
- type MessageGetter
- type Option
- func WithBadRequest() Option
- func WithCode(code int) Option
- func WithForbidden() Option
- func WithInternalError() Option
- func WithLocation(location string) Option
- func WithMessage(message string) Option
- func WithNotFound() Option
- func WithUnauthorized() Option
- func WithWrappedValue(inner error) Option
- type Plugin
- type PluginList
- type RetryAfterGetter
- type URLGetter
- type Unwrapper
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ErrorCode ¶
ErrorCode returns an error code for any error. It tries to read the error code from objects matching the ErrorCodeGetter interface. If the provided error does not match this interface, then it assigns a generic "Internal Server Error" code 500.
func IsBadRequest ¶ added in v0.32.2
IsBadRequest returns TRUE if this is a 400 (Bad Request) error.
func IsClientError ¶
IsClientError returns TRUE if the error `Code` is a 4xx / Client Error error. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_client_errors
func IsForbidden ¶ added in v0.32.2
IsForbidden returns TRUE if this is a 403 (Forbidden) error.
func IsInformational ¶
IsInformational returns TRUE if the error `Code` is a 1xx / Informational error. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#1xx_informational_response
func IsInternalServerError ¶ added in v0.32.2
IsInternalServerError returns TRUE if this is a 500 (Internal Server Error) error.
func IsMisdirectedRequest ¶ added in v0.32.2
IsMisdirectedRequest returns TRUE if this is a 421 (Misdirected Request) error.
func IsNil ¶ added in v0.32.2
IsNil performs a robust nil check on an error interface Shout out to: https://medium.com/@mangatmodi/go-check-nil-interface-the-right-way-d142776edef1
func IsNotFound ¶ added in v0.32.1
IsNotFound returns TRUE if this is a 404 (Not Found) error.
func IsNotFoundOrGone ¶ added in v0.34.0
IsNotFoundOrGone returns TRUE if this is a 404 (Not Found) or 410 (Gone) error.
func IsNotImplemented ¶ added in v0.32.2
IsNotImplemented returns TRUE if this is a 501 (Not Implemented) error.
func IsRedirection ¶
IsRedirection returns TRUE if the error `Code` is a 3xx / Redirection error. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_redirection
func IsServerError ¶
IsServerError returns TRUE if the error `Code` is a 5xx / Server Error error. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#5xx_server_errors
func IsSuccess ¶
IsSuccess returns TRUE if the error `Code` is a 2xx / Success error. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_success
func IsTooManyRequests ¶ added in v0.34.2
IsTooManyRequests returns TRUE if this is a 429 (Too Many Requests) error. If TRUE, it tries to find the recommended retry duration from the returned error. If no duration is found, then a default 1 hour retry duration is used.
func IsUnauthorized ¶ added in v0.32.2
IsUnauthorized returns TRUE if this is a 401 (Unauthorized) error.
func IsValidationError ¶ added in v0.32.2
IsValidationError returns TRUE if this is a 422 (Validation) error.
func Location ¶ added in v0.32.3
Location retrieves the best-fit error location for any type of error
func Report ¶
func Report(err error)
Report takes ANY error (hopefully a derp error) and attempts to report it via all configured error reporting mechanisms.
func ReportAndReturn ¶
ReportAndReturn reports an error to the logger and also returns it to the caller.
func ReportFunc ¶ added in v0.32.7
func ReportFunc(fn func() error)
ReportFunc executes the provided function and reports any error that occurs. This is useful with `defer` statements, preventing the underlying function from being executed before the deferred call.
func RetryAfter ¶ added in v0.35.0
RetryAfter retrieves the best-fit retry-after duration (in seconds) for any type of error
func RootCause ¶
RootCause digs into the error stack and returns the original error that caused the DERP. This is an alias for the Unwrap() function.
func RootLocation ¶ added in v0.32.5
RootLocation returns the deepest location defined within a chain of wrapped errors.
func RootMessage ¶ added in v0.32.5
RootMessage returns the deepest message available within a chain of wrapped errors.
func Unwrap ¶ added in v0.34.2
Unwrap digs into the error stack and returns the original error that caused the DERP
func Wrap ¶
Wrap encapsulates an existing derp.Error, and is guaranteed to return a "Not Nil" value. This function ALWAYS returns a non-nil error value.
Example ¶
// Derp errors can be nested, containing detailed information
// about the entire call stack, with specifics about what went
// wrong at every level
innerErr := NotFound("Inner Function", "Original Error")
middleErr := Wrap(innerErr, "Middleware Function", "Error calling 'innerErr'", "parameter", "list", "here")
outerErr := Wrap(middleErr, "Error in Main Function", "Error calling 'middleErr'", "suspected", "cause", "of", "the", "error")
Report(outerErr)
Example (StandardErrors) ¶
// Wrap also works with standard library errors
// so you can add information to errors that are
// exported by other packages that don't use derp.
thisBreaks := func() error {
return errors.New("Something failed")
}
// Try something that fails
if err := thisBreaks(); err != nil {
// Populate a derp.Error with everything you know about the error
result := Wrap(err, "Example", "Something broke in `thisBreaks`", WithCode(404), "additional details go here")
// Call .Report() to send an error to Ops. This is a system-wide
// configuration that's set up during initialization.
Report(result)
}
Types ¶
type DetailsGetter ¶ added in v0.32.3
type DetailsGetter interface {
// Details returns a list of details about the error.
GetDetails() []any
}
DetailsGetter interface wraps the GetDetails method, which returns a list of details about the error
type Error ¶
type Error struct {
Code int `json:"code"` // Numeric error code (such as an HTTP status code) to report to the client.
Location string `json:"location"` // Function name (or other location description) of where the error occurred
Message string `json:"message"` // Primary (top-level) error message for this error
URL string `json:"url,omitempty"` // URL to a web page with more information about this error
Details []any `json:"details,omitempty"` // Additional information related to this error message, such as parameters to the function that caused the error.
TimeStamp int64 `json:"timestamp"` // Unix Epoch timestamp of the date/time when this error was created
WrappedValue error `json:"innerError,omitempty"` // An underlying error object used to identify the root cause of this error.
}
Error represents a runtime error. It includes
func BadRequest ¶ added in v0.33.0
BadRequest returns a (400) Bad Request error which indicates that the request is not properly formatted. https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request
func BadRequestError ¶ added in v0.32.1
deprecated: use BadRequest() instead
func Forbidden ¶ added in v0.33.0
Forbidden returns a (403) Forbidden error which indicates that the current user does not have permissions to access the requested resource. https://www.rfc-editor.org/rfc/rfc9110.html#name-403-forbidden
func ForbiddenError ¶ added in v0.32.1
deprecated: use Forbidden() instead
func Gone ¶ added in v0.34.0
Gone returns a (410) Gone error which indicates that the resource requested is no longer available and will not be available again. https://www.rfc-editor.org/rfc/rfc9110.html#name-410-gone
func Internal ¶ added in v0.33.0
Internal returns a (500) Internal Server Error which represents a generic error message, given when an unexpected condition was encountered and no more specific message is suitable. https://www.rfc-editor.org/rfc/rfc9110.html#name-500-internal-server-error
func InternalError ¶ added in v0.32.1
deprecated: use Internal() instead
func MisdirectedRequest ¶ added in v0.33.0
MisdirectedRequest returns a (421) Misdirected Request error. which indicates that the request was made to the wrong server; that server is not able to produce a response. https://www.rfc-editor.org/rfc/rfc9110.html#name-421-misdirected-request
func MisdirectedRequestError ¶ added in v0.32.1
deprecated: use MisdirectedRequest() instead
func NotFound ¶
NotFound returns a (404) Not Found error which indicates that the requested resource does not exist, such as when database query returns "not found" https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found
func NotFoundError ¶ added in v0.32.1
deprecated: use NotFound() instead
func NotImplemented ¶ added in v0.33.0
NotImplemented returns a (501) Not Implemented error which indicates that the server does not support the functionality required to fulfill the request. https://www.rfc-editor.org/rfc/rfc9110.html#name-501-not-implemented
func NotImplementedError ¶ added in v0.32.1
deprecated: use NotImplemented() instead
func Teapot ¶ added in v0.33.0
Teapot returns a (418) I'm a Teapot error which indicates that the server is a teapot that cannot serve HTTP requests. https://www.rfc-editor.org/rfc/rfc7168.html#name-418-im-a-teapot https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#418
func TeapotError ¶ added in v0.32.1
deprecated: use Teapot() instead
func Timeout ¶ added in v0.33.0
Timeout returns a (524) Timeout error which indicates that the request took longer than an internal timeout threshold https://http.dev/524
func TimeoutError ¶ added in v0.32.4
deprecated: use Timeout() instead
func Unauthorized ¶ added in v0.33.0
Unauthorized returns a (401) Unauthorized error which indicates that the request requires user authentication. https://www.rfc-editor.org/rfc/rfc9110.html#name-401-unauthorized
func UnauthorizedError ¶ added in v0.32.1
deprecated: use Unauthorized() instead
func Validation ¶ added in v0.33.0
Validation returns a (422) Validation error which indicates that the request contains invalid data. https://www.rfc-editor.org/rfc/rfc9110.html#name-422-unprocessable-content
func ValidationError ¶ added in v0.16.0
deprecated: use Validation() instead
func (Error) Error ¶
Error implements the Error interface, which allows derp.Error objects to be used anywhere a standard error is used.
func (Error) GetDetails ¶ added in v0.32.3
GetDetails returns the error Details embedded in this Error.
func (Error) GetErrorCode ¶
GetErrorCode returns the error Code embedded in this Error.
func (Error) GetLocation ¶ added in v0.32.3
GetLocation returns the error Location embedded in this Error.
func (Error) GetMessage ¶
GetMessage returns the error Message embedded in this Error.
func (Error) GetRetryAfter ¶ added in v0.35.0
GetRetryAfter returns the retry-after duration (in seconds) provided by the WrappedValue. If the WrappedValue is nil, or does not implement the RetryAfterGetter interface, this method returns 0
func (Error) GetTimeStamp ¶ added in v0.32.3
GetTimeStamp returns the error TimeStamp embedded in this Error.
type ErrorCodeGetter ¶
type ErrorCodeGetter interface {
// ErrorCode returns a numeric, application-specific code that references this error.
// HTTP status codes are recommended, but not required
GetErrorCode() int
}
ErrorCodeGetter interface wraps the GetErrorCode method, which returns a numeric, application-specific code that references this error
type HTTPError ¶ added in v0.34.2
type HTTPError struct {
Request HTTPRequestReport `json:"request"`
Response HTTPResponseReport `json:"response"`
WrappedValue error `json:"innerError,omitempty"` // An underlying error object used to identify the root cause of this error.
}
HTTPError wraps a standard derp.Error, including additional data about a failed HTTP transaction
func NewHTTPError ¶ added in v0.34.2
NewHTTPError creates a new HTTPError object from the given request and response
func UnwrapHTTPError ¶ added in v0.34.2
UnwrapHTTPError unwraps the provided error, returning the first HTTPError found in the chain. If no HTTPError is found, this function returns nil.
func WrapHTTPError ¶ added in v0.34.2
WrapHTTPError creates a new HTTPError object from the given request/response ands wraps an existing error
func (HTTPError) Error ¶ added in v0.34.2
Error implements the Error interface, which allows derp.Error objects to be used anywhere a standard error is used.
func (HTTPError) GetErrorCode ¶ added in v0.34.2
GetErrorCode returns the error Code embedded in this Error.
func (HTTPError) GetRetryAfter ¶ added in v0.35.0
RetryAfter returns the number of seconds to wait until retrying the transaction. It is derived from one of several possible headers in the HTTP response, including `Retry-After`, `X-Ratelimit-Reset`, and `X-Rate-Limit-Reset`.
If no such header is found, this method returns a default of 3600 seconds (1 hour). https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/429
type HTTPRequestReport ¶ added in v0.34.2
type HTTPRequestReport struct {
URL string `json:"url"`
Method string `json:"method"`
Header http.Header `json:"header"`
}
HTTPRequestReport includes details of a failed HTTP request
type HTTPResponseReport ¶ added in v0.34.2
type HTTPResponseReport struct {
StatusCode int `json:"statusCode"`
Status string `json:"status"`
Header http.Header `json:"header"`
}
HTTPResponseReport includes response details of a failed HTTP request
type LocationGetter ¶ added in v0.32.3
type LocationGetter interface {
// Location returns the location of the error in the source code.
GetLocation() string
}
LocationGetter interface wraps the GetLocation method, which returns the location of the error
type MessageGetter ¶
type MessageGetter interface {
// Message returns a human-friendly string representation of the error.
GetMessage() string
}
MessageGetter interface wraps the GetMessage method, which returns a human-friendly string representation of the error
type Option ¶
type Option func(*Error)
Option defines a function that modifies a derp.Error
func WithBadRequest ¶
func WithBadRequest() Option
WithBadRequest returns an option that sets the derp.Error code to 400 (Bad Request)
func WithForbidden ¶
func WithForbidden() Option
WithForbidden returns an option that sets the derp.Error code to 403 (Forbidden)
func WithInternalError ¶
func WithInternalError() Option
WithInternalError returns an option that sets the derp.Error code to 500 (Internal Server Error)
func WithLocation ¶
WithLocation returns an option that sets the derp.Error location
func WithMessage ¶
WithMessage returns an option that sets the derp.Error message
func WithNotFound ¶
func WithNotFound() Option
WithNotFound returns an option that sets the derp.Error code to 404 (Not Found)
func WithUnauthorized ¶ added in v0.34.1
func WithUnauthorized() Option
WithUnauthorized returns an option that sets the derp.Error code to 401 (Unauthorized)
func WithWrappedValue ¶
WithWrappedValue returns an option that sets the derp.Error wrapped value
type Plugin ¶
type Plugin interface {
Report(error)
}
Plugin wraps the "Report" method, which reports a derp error to an external source. Reporters are responsible for handling and swallowing any errors they generate.
type PluginList ¶
type PluginList []Plugin
PluginList represents an array of plugins, which will be called in succession whenever the Error.Report() function is called.
var Plugins PluginList = make([]Plugin, 0)
Plugins is the array of objects that are able to report a derp when err.Report() is called.
func (PluginList) Add ¶
func (list PluginList) Add(plugin Plugin) PluginList
Add registers a new plugin to the system-wide configuration. This lets the developer configure and append additional plugins during initialization. It should be called during system startup only.
func (PluginList) Clear ¶
func (list PluginList) Clear() PluginList
Clear removes all plugins from the system-wide configuration. It is useful for removing the library default Console() from the list of plugins, in the event that you don't want to report errors to the console.
type RetryAfterGetter ¶ added in v0.35.0
type RetryAfterGetter interface {
// RetryAfter returns the number of seconds to wait before retrying the operation that caused this error.
GetRetryAfter() time.Duration
}
RetryAfterGetter interface wraps the GetRetryAfter method, which returns the number of seconds to wait before retrying the operation that caused this error