当前位置: 首页 > news >正文

网站做语言切换扬州市城乡建设局网站

网站做语言切换,扬州市城乡建设局网站,网站建设及系统开发,做门户网站开发的技术一、背景 在工程开发中,我们有以下场景可以用错误码解决 我们不太方便直接将内部的错误原因暴露给外部,可以根据错误码得到对应的外部暴露消息通过设定错误码判断是客户端或者服务端的问题,避免不必要的排障浪费方便查找日志,定…

一、背景

在工程开发中,我们有以下场景可以用错误码解决

  1. 我们不太方便直接将内部的错误原因暴露给外部,可以根据错误码得到对应的外部暴露消息
  2. 通过设定错误码判断是客户端或者服务端的问题,避免不必要的排障浪费
  3. 方便查找日志,定位问题

错误码设计

设计带有错误码的error

核心代码

type withCode struct {msg   stringcode  int
}func WithCode(code int, format string, args ...interface{}) error {msg := fmt.Sprintf(format, args...)return errors.Wrap(&withCode{msg: msg,code:  code,}, msg)
}// Error return the externally-safe error message.
func (w *withCode) Error() string { return msg }func ParseCoder(err error) Coder {codeErr := &withCoder{}if errors.As(err, codeErr) {if coder, ok := codes[codeErr.code]; ok {return coder}}return UnknownCoder
}

完整代码
github.com/marmotedu/errors v1.0.2

Coder的设计

提供register方法将错误码和相关信息注册在map内部,需要用到错误码信息的时候根据code拿到相关信息返回即可
接口设计

type Coder interface {// HTTP status that should be used for the associated error code.HTTPStatus() int// External (user) facing error text.String() string// Code returns the code of the coderCode() int
}

完整实现

var codes = map[int]Coder{}
var codeMux = &sync.Mutex{}type Coder interface {// HTTP status that should be used for the associated error code.HTTPStatus() int// External (user) facing error text.String() string// Code returns the code of the coderCode() int
}type ErrCode struct {// C refers to the code of the ErrCode.C int// HTTP status that should be used for the associated error code.HTTP int// External (user) facing error text.Ext string
}var _ errors.Coder = &ErrCode{}// Code returns the integer code of ErrCode.
func (coder ErrCode) Code() int {return coder.C
}// String implements stringer. String returns the external error message,
// if any.
func (coder ErrCode) String() string {return coder.Ext
}// HTTPStatus returns the associated HTTP status code, if any. Otherwise,
// returns 200.
func (coder ErrCode) HTTPStatus() int {if coder.HTTP == 0 {return http.StatusInternalServerError}return coder.HTTP
}// MustRegister register a user define error code.
// It will panic when the same Code already exist.
func MustRegister(coder Coder) {if coder.Code() == 0 {panic("code '0' is reserved by 'github.com/marmotedu/errors' as ErrUnknown error code")}codeMux.Lock()defer codeMux.Unlock()if _, ok := codes[coder.Code()]; ok {panic(fmt.Sprintf("code: %d already exist", coder.Code()))}codes[coder.Code()] = coder
}// ParseCoder parse any error into *withCode.
// nil error will return nil direct.
// None withStack error will be parsed as ErrUnknown.
func ParseCoder(err error) Coder {if err == nil {return nil}if v, ok := err.(*withCode); ok {if coder, ok := codes[v.code]; ok {return coder}}return unknownCoder
}// IsCode reports whether any error in err's chain contains the given error code.
func IsCode(err error, code int) bool {if v, ok := err.(*withCode); ok {if v.code == code {return true}if v.cause != nil {return IsCode(v.cause, code)}return false}return false
}func init() {codes[unknownCoder.Code()] = unknownCoder
}

错误码注册

在工程内部创建一个文件专门设置错误码,并实现init方法针对错误码和信息完成注册

const (// ErrUserNotFound - 404: User not found.ErrUserNotFound int = iota + 110001// ErrUserAlreadyExist - 400: User already exist.ErrUserAlreadyExist
)// iam-apiserver: secret errors.
const (// ErrEncrypt - 400: Secret reach the max count.ErrReachMaxCount int = iota + 110101//  ErrSecretNotFound - 404: Secret not found.ErrSecretNotFound
)// iam-apiserver: policy errors.
const (// ErrPolicyNotFound - 404: Policy not found.ErrPolicyNotFound int = iota + 110201
)func init() {register(ErrUserNotFound, 404, "User not found")register(ErrUserAlreadyExist, 400, "User already exist")register(ErrReachMaxCount, 400, "Secret reach the max count")register(ErrSecretNotFound, 404, "Secret not found")register(ErrPolicyNotFound, 404, "Policy not found")register(ErrSuccess, 200, "OK")register(ErrUnknown, 500, "Internal server error")register(ErrBind, 400, "Error occurred while binding the request body to the struct")register(ErrValidation, 400, "Validation failed")
}

错误码使用

func WriteResponse(c *gin.Context, err error, data interface{}) {if err == nil {c.JSON(http.statusOK, data)return}if coder := coder.ParseCoder(err); coder != coder.UnknownCoder {c.JSON(coder.HTTPStatus, Response{Code: coder.Code(),Message: coeder.String(),Data: data,	})return }c.JSON(http.StatusOk, err)
http://www.yayakq.cn/news/690562/

相关文章:

  • 腾讯云购买域名后如何建网站怎么做直播室的网站
  • 贵港做网站化司天津网站建设首选 津坤科技
  • 巨鹿网站建设多少钱票务网站开发
  • 网站图片用什么做的舆情报告封面
  • 汉口网站建设公司推动高质量发展就是要
  • 上海网站建设在哪小白怎么建设网站
  • 重庆网站编辑职业学校奖券世界推广网站
  • 迁西县住房和城乡规划建设局网站免费建设个人网站
  • 广州个人网站建设公司苏州网络公司优惠政策
  • 网站安全体系建设方案比较网站建设
  • 最好的做网站公司有哪些注册安全工程师题库免费版
  • 全国新闻怎么seo网站关键词优化
  • 网站建设入门教学建立网站专栏
  • 网站代理游戏wordpress live-calendar
  • 视频网站哪个做的好做网站ddos攻击
  • 建设项目备案网站管理系统免费行情软件app合集
  • wordpress设置中改网站Wordpress教程推荐
  • 汕头网站设计哪里好品牌营销策划公司
  • 盘锦网站建设流程常州网站关键词推广
  • 个人网站做seo企业网站建设验收
  • 网站后台登陆界面模板国外网站要备案吗
  • dedecms做图库网站做网站续费
  • 深圳手机网站建设哪家好响应式手机网站模版
  • 企业做网站流程什么是网站目录结构
  • 深圳网站设计工资一般多少会网站建设怎样赚钱
  • 苏州住房与城乡建设部网站商城网站模板 免费
  • 黑山网站建设在线编辑网页
  • 男做基视频网站谷歌绘制的网站
  • 贵阳网站建设 设计可以吗discuzq官网
  • 常州网站建设运营网站建设需求填表