• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go 错误处理设计思考

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

前段时间准备对线上一个golang系统服务进行内部开源,对代码里面的错误处理进行了一波优化。

优化的几个原因:

  • 错误处理信息随意,未分类未定义。看到错误日志不能第一时间定位
  • 错误的日志重复,有时候一个错误经过了好几层,每一层都会记录,导致日志混乱
  • 错误处理不统一,使用不统一,管理也不统一

优化的解决办法:

  • 对错误进行分类,统一定义和使用
  • 每一个错误都有冒泡到包的顶层,处理与记日志。使用方只需定义好自己的信息

实施过程

错误分类:函数级,包模块级,系统api级。

函数级别:

还是采用 err != nil 的形式,并且做一个如下的包装。

模块级别

统一返回到对应的goroutine顶层处理

服务对外级别

适当的code和健名的message

底层错误级别

考虑及时panic,暴露有用信息

以下为代码设计:

点击查看代码
package ferrors

import (
	"fmt"
	"golang.org/x/xerrors"
)

//Errors 新的错误处理方式
type Errors struct {
	Code int64
	Msg  string
}

// Error 输出错误信息
func (e Errors) Error() string {
	return fmt.Sprintf("code: %d msg: %s at: %s", e.Code, e.Msg, "错误位置,堆栈信息,可选")
}

// New 创建自定义错误
func New(code int64, str string, arg ...interface{}) *Errors {
	if len(arg) > 0 {
		str = fmt.Sprintf(str, arg...)
	}
	return &Errors{Code: code, Msg: str}
}

// newErr 创建通用错误
func newErr(code int64, err error) *Errors {
	switch err := err.(type) {
	case *Errors:
		return err
	case nil:
		return &Errors{Code: code, Msg: ""}
	default:
		return &Errors{Code: code, Msg: err.Error()}
	}
}
func NewErrNotFound(err error) error {
	return newErr(CodeMkNotFound, err)
}

// ErrorEcho example:使用 error wrapping
func ErrorEcho(err error) string {

	return fmt.Sprintf("the error %w", err)
}

//ErrorDump example: xerrors 打印堆栈信息
func ErrorDump() {
	err := foo1()
	fmt.Printf("%v\n", err)
	fmt.Printf("%+v\n", err)
}

var myError = xerrors.New("myerror")

func foo() error {
	return myError
}
func foo1() error {
	return xerrors.Errorf("foo1 : %w", foo())
}


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言核心36讲(Go语言实战与应用七)--学习笔记发布时间:2022-07-10
下一篇:
mac本用WTG(Windows To Go)安装Win10到移动硬盘发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap