在go的默认错误实现中,任何异常错误都会返回500,实际项目中我们需要根据异常的不同去设置code的不同
package ErrorHandler
import (
"context"
"net/http"
)
type MyError struct{
Code int
Message string
}
func NewMyError(code int, msg string) error {
return &MyError{Code: code, Message: msg}
}
func (this *MyError) Error() string {
return this.Message
}
func MyErrorEncoder(ctx context.Context, err error, w http.ResponseWriter) {
contentType, body := "text/plain; charset=utf-8", []byte(err.Error())
//设置请求头
w.Header().Set("Content-type", contentType)
// 通过类型断言判断当前error的类型,走相应的处理
if myerr, ok := err.(*MyError); ok {
w.WriteHeader(myerr.Code)
w.Write(body)
} else {
// 如果不是自定义错误处理
w.WriteHeader(500)
w.Write(body)
}
}
基于go-kit的ServerOption
传入
opts := []httpTransport.ServerOption{
httpTransport.ServerErrorEncoder(ErrorHandler.MyErrorEncoder),
httpTransport.ServerBefore(httpTransport.PopulateRequestContext),
}
如果出现异常,例如限流器出现的toot many request
异常,想要返回自定义的429,就可以用自定义的异常错误处理。
return nil, utils.NewMyError(429, "toot many request")