The Error struct in Hertz:
type Error struct {
Err error
Type ErrorType
Meta interface{}
}
Err
is standard error, Type
is the type of error, Meta
is the metadata.
In order to handle errors more efficiently, Hertz has predefined the following error types:
// Error in binding process
ErrorTypeBind ErrorType = 1 << iota
// Error in rendering process
ErrorTypeRender
// Hertz private errors that business need not be aware
ErrorTypePrivate
// Hertz public errors that require external perception as opposed to Private
ErrorTypePublic
// Other Error
ErrorTypeAny
It is recommended to define the corresponding errors according to the error type.
Using the following functions:
// shortcut for creating a public *Error from string
func NewPublic(err string) *Error {
return New(errors.New(err), ErrorTypePublic, nil)
}
// shortcut for creating a private *Error from string
func NewPrivate(err string) *Error {
return New(errors.New(err), ErrorTypePrivate, nil)
}
func New(err error, t ErrorType, meta interface{}) *Error {
return &Error{
Err: err,
Type: t,
Meta: meta,
}
}
func Newf(t ErrorType, meta interface{}, format string, v ...interface{}) *Error {
return New(fmt.Errorf(format, v...), t, meta)
}
func NewPublicf(format string, v ...interface{}) *Error {
return New(fmt.Errorf(format, v...), ErrorTypePublic, nil)
}
func NewPrivatef(format string, v ...interface{}) *Error {
return New(fmt.Errorf(format, v...), ErrorTypePrivate, nil)
}
signature | description |
---|---|
SetType(flags ErrorType) *Error | set the ErrorType to the given flags |
Error() string | implement the error interface |
Unwrap() error | throw an error |
SetMeta(data interface{}) *Error | set the Meta to the given data |
IsType(flags ErrorType) bool | determine whether the ErrorType matches the given flags |
JSON() interface{} | convert the error to a json object |
In addition to the conventions for error definition, the framework also provides ErrorChain capability. As the name implies, it is easy for the business to bind all errors encountered on a request processing to the error chain, which can facilitate the subsequent (usually in the middleware) unified processing of all errors.
signature | description |
---|---|
String() string | return a human-readable text for displaying all errors |
Errors() []string | convert the ErrorChain to an array of standard errors |
ByType(typ ErrorType) ErrorChain | return the corresponding sub-ErrorChain for the given error type |
Last() *Error | return the last error |
JSON() interface{} | convert all errors to a json object |
The corresponding API is: RequestContext.Error(err)
, and calling this API will tie the err to the corresponding request context.
Method to get all the errors that have been bound by the request context: RequestContext.Errors
.
// go run this code and use your browser to access localhost:80880/error
package main
import (
"context"
"errors"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
func main() {
h := server.New(server.WithHostPorts(":8080"))
h.GET("/error", handle1, handle2, handle3)
h.Spin()
}
func handle1(_ context.Context, c *app.RequestContext) {
_ = c.Error(errors.New("first err"))
}
func handle2(_ context.Context, c *app.RequestContext) {
_ = c.Error(errors.New("second err"))
}
func handle3(_ context.Context, c *app.RequestContext) {
c.JSON(consts.StatusOK, c.Errors.Errors())
}