错误处理

错误类型

为了更高效的处理错误,Hertz 针对错误类型做了如下预定义:

// binding 过程的错误
ErrorTypeBind ErrorType = 1 << iota
// rendering 过程的错误
ErrorTypeRender
// Hertz内部错误,业务无需感知
ErrorTypePrivate
// 相对于Private来说,需要外部感知的错误
ErrorTypePublic
// 其他错误
ErrorTypeAny

建议按照错误类别定义相应的错误。

相关接口

// 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,
   }
}

ErrorChain

除了针对错误定义的约定以外,框架同时提供 ErrorChain(错误链)能力。顾名思义,能够方便业务将一次请求处理上所遇到的所有错误绑定到错误链上,可以方便后续(一般是在中间件中)对所有错误进行统一处理。 对应的 API 为:RequestContext.Error(err),调用该 API 会将 err 绑到对应的请求上下文上之上。

获取请求上下文已绑定的所有错误的方式:RequestContext.Errors(ErrorChain)。ErrorChain 目前提供的 API:

ByType:按错误类型返回对应的子错误链
Errors:将错误链转换为标准错误数组
JSON:将所有错误转换为json对象
Last: 返回最后(最新)的一个错误
String:可读性强的文本展示所有错误

最后修改 April 4, 2023 : optimzie: custom_tpl docs (#597) (b3e25f4)