当前位置: 首页 > 工具软件 > Go-kit > 使用案例 >

Go-kit 自定义异常错误处理

袁亦
2023-12-01

前言

在go的默认错误实现中,任何异常错误都会返回500,实际项目中我们需要根据异常的不同去设置code的不同

一、自定义Error处理器

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

基于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") 
 类似资料: