其他分享
首页 > 其他分享> > 从零开发区块链应用(四)--自定义业务错误信息

从零开发区块链应用(四)--自定义业务错误信息

作者:互联网

目录

一、如何自定义错误信息

1.1 为什么要自定义自己的错误信息

在实际开发中引入错误码有如下好处:

1.2 错误码设计

一个良好结构的错误码有助于简化问题描述, 当前设计的错误码共有五位, 结构如下:

1 00 01
服务级错误 服务模块 具体错误代码

二、 实际开发错误处理

2.1 代码实现

在项目目录下新建一个 apicommon 目录, 并创建相应的模块。

package apicommon

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

type Response struct {
	Error *Error      `json:"error,omitempty"`
	Msg   string      `json:"message"`
	Code  int64       `json:"code"`
	Data  interface{} `json:"result,omitempty"`
}

type Error struct {
	Code int64  `json:"code"`   // 错误码
	Msg  string `json:"message"`  // 返回给用户的信息
	Data string `json:"data,omitempty"` // 保存的内部错误信息
}

// ReturnErrorResponse 返回错误
func ReturnErrorResponse(ctx *gin.Context, errmsg string, code int64, err string) {
	response := &Response{
		Error: &Error{
			Msg:  errmsg,   
			Code: code,
			Data: err,
		},
	}
	ctx.JSON(http.StatusOK, response)
	return
}

2.2 错误码实战

上面介绍了错误码的一些知识,这一部分讲开发中是如何使用 自定义错误函数来处理错误信息的。为了演示,我们新增一个根据手机号获取验证码的 API:

handler/router.go 中添加路由

func RouterStart() {

	gin.SetMode(gin.ReleaseMode) //设置gin模式

	router := gin.New()

	personal := router.Group("/api/v2")
	{
		personal.POST("/sso/getAuthCode", handler.GetAuthCode)
	}	
	logger.Info("API server start", "listen", config.Conf.Console.Port)
	router.Run(config.Conf.Console.Port)
}

handler 目录下增加业务处理函数 handler/personal.go

//手机号校验
func VerifyMobileFormat(mobileNum string) bool {
	regular := "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$"
	reg := regexp.MustCompile(regular)
	return reg.MatchString(mobileNum)
}

// 根据手机号获取验证码
func GetAuthCode(ctx *gin.Context) {
	phone := ctx.PostForm("telephone")
	logger.Info("GetAuthCodeRequest req:", "phone:", phone)

	//判断手机号是否正确
	res := VerifyMobileFormat(phone)
	if res == false { //如果错误,则返回:手机号错误信息
		apicommon.ReturnErrorResponse(ctx, "手机号错误!", -1, "Wrong phone number")

	} else { //如果正确,则发送验证码给用户,并将验证码set到redis中
		//生成6位数随机验证码
		auth_code := fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000))
		//调用短信服务商,发送短信,此处代码暂时省略
		fmt.Println(auth_code)

		//将手机号及验证码set到redis中,过期时间为30s
		redis.RedisDB.Set(phone, auth_code, 30*time.Second)
		apicommon.ReturnSuccessResponse(ct "success", 0, nil)
	}
}

经过编译及运行以上代码后,进行测试和验证

# curl --location --request POST 'localhost:9100/api/v2/sso/getAuthCode' \
--form 'telephone="11081719844"'

{
    "message": "手机号错误!",
    "code": -1,
    "result": "Wrong phone number"
}

因为传入的手机号码错误,所以报错:手机号错误

# curl --location --request POST 'localhost:9100/api/v2/sso/getAuthCode' \
--form 'telephone="18281981546"'

{
    "message": "success",
    "code": 0,
    "result": "nil"
}

如果验证手机号码通过,则会返回成功的 message: success和code: 0 和result: nil。

如果 API 是对外的,错误信息数量有限,则制定错误码非常容易,强烈建议使用错误码。如果是内部系统,特别是庞大的系统,内部错误会非常多,这时候没必要为每一个错误制定错误码,而只需为常见的错误制定错误码,对于普通的错误,系统在处理时会统一作为 InternalServerError 处理。

标签:code,自定义,错误,--,错误信息,错误码,gin,手机号
来源: https://www.cnblogs.com/jemooner/p/15820426.html