当前位置:首页 >> 中医新闻 >> Go Error 处理最佳出发点

Go Error 处理最佳出发点

发布时间:2024-10-11

e error Err error}func Tour(t ZooTour, panda *Panda) error { t.Enter t.VisitPanda(panda) t.Lee // 都有编读到业务范围直觉示例,最后确立处置error if err := t.Err err != nil { return errors.WithMessage(err, CoquotZooTour failed") } return nil} 2.3 利用参数型式程序设计延期接入

转化或多或少 - 结点到访用数据形态定义接入顺序排列,根据场面选择,如顺序排列、逆序、二叉果树果树结点等。接入直觉将示例的依靠流直觉抽离,轻巧缩减。kubernetes 里的 visitor 必须接受就有很多种延展方型式为,转化了数据和行为,不感兴趣可以去延展读物

type Walker interface { Next MyFunc}type SliceWalker struct { index int funs []MyFunc}func NewEnterFunc MyFunc { return func(t ZooTour) error { return t.Enter }}func Break(t ZooTour, walker Walker) error { for { f := walker.Next if f == nil { break } if err := f(t) err := nil { // 碰见误解break或者continue继续可执行 } }} 2.4 三种方型式为对比

上面这三个案例,是 Go 重大项目处置误解采用频率极高的三种方型式为,也可以数据分析方法在 error 除此以外的处置直觉。

case 1: 如果业务范围直觉不是很正确,非常破例 case1 case 2: 示例很少去更动,十分相似国际标准戈,可以采用 case2 case 3: 非常复杂的场面,复杂到抽象成一种设计者模型式 三、的单下的 Error Handling 3.1 一个常见的三层绑定 // controllerif err := mode.ParamCheck(param) err != nil { log.Errorf(Coquotparam=%+v", param) return errs.ErrInvalidParam}return mode.ListTestName("")// service_, err := dao.GetTestName(ctx, settleId) if err != nil { log.Errorf(CoquotGetTestName failed. err: %v", err) return errs.ErrDatabase}// daoif err != nil { log.Errorf(CoquotGetTestDao failed. uery: %s error(%v)", sql, err)} 3.2 难题归纳 的单开发新的引发的却是墨水会话 很难利用详细的模板相关联 根因出错 3.3 Wrap erros

Go 就其的误解处置方法有很多,但居多为过渡另建议,这里就不一一数据分析了(十分相似 github.com/juju/errors 戈,不感兴趣可以明白)。这里我以 github.com/pkg/errors 为例,这个也是官方网南站 Proposal 的综合参考对象。

误解要被会话记录。 数据分析方法机制处置误解,前提 100%完整性。 便不不须调查结果一般来说误解(误解只被处置一次)。

github.com/pkg/errors 包内主要包内含所列几个方法有,如果我们要新的生成一个误解,可以采用 New参数,生成的误解,自带绑定模板资讯。如果有一个现成的 error,我们须要对他来进行不须次包内装处置,这时候有三个参数可以选择(WithMessage/WithStack/Wrapf)。其次,如果须要对源误解一般来说来进行图标确实可以采用 Cause,可以获取最根本的误解或许。

// 新的生成一个误解, 带模板资讯func New(message string) error// 只另加新的的资讯func WithMessage(err error, message string) error// 只另加绑定模板资讯func WithStack(err error) error// 同时另加模板和资讯func Wrapf(err error, format string, args ...interface{}) error// 获取最根本的误解或许func Cause(err error) error

以常见的一个三层体系结构为例:

Dao 层采用 Wrap 上抛误解 if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, errors.Wrapf(ierror.ErrNotFound, Coquotquery:%s", query) } return nil, errors.Wrapf(ierror.ErrDatabase, Coquotquery: %s error(%v)", query, err) } Service 层追加资讯 bills, err := a.Dao.GetName(ctx, param) if err != nil { return result, errors.WithMessage(err, CoquotGetName failed") } MiddleWare 确立墨水误解会话 // 劝告响应零件func (Format) Handle(next ihttp.MiddleFunc) ihttp.MiddleFunc { return func(ctx context.Context, req *http.Request, rsp *ihttp.Response) error { format := Coampformat{Time: time.Now.Unix} err := next(ctx, req, rsp) format.Data = rsp.Data if err != nil { format.Code, format.Msg = errCodes(ctx, err) } rsp.Data = format return nil }}// 利用误解码func errCodes(ctx context.Context, err error) (int, string) { if err != nil { log.CtxErrorf(ctx, Coquoterror: [%+v]", err) } var myError = new(erro.IError) if errors.As(err, CoampmyError) { return myError.Code, myError.Msg } return code.ServerError, i18n.CodeMessage(code.ServerError)} 和其他戈来进行密切合作 如果和其他戈来进行密切合作,再考虑采用 errors.Wrap 或者 errors.Wrapf 保有模板资讯。举例来说适用 于和国际标准戈密切合作的时候。 _, err := os.Open(path)if err != nil { return errors.Wrapf(err, CoquotOpen failed. [%s]", path)} 收纳如果绑定其他收纳的参数,通常简单的这样一来 return err

最终精准度样例:

3.4 早不须归纳

MyError 作为全局 error 的中下层实现,保有具锥体的误解码和误解资讯; MyError 微微赶回误解时,第一次不须用 Wrap 绑定模板,更进一步用 WithMessage 增高模板资讯; 要确实 error 究竟为指定的误解时,可以采用 errors.Cause 利用 root error,不须来进行和 sentinel error 断定; github.com/pkg/errors 和国际标准戈的 error 无论如何接口,可以不须替换、更进一步改造历史背景遗留的示例; 墨水 error 的模板须要用%+v,而原来的%v 依旧为普通字符串方法有;同时也要特别注意会话采集方法究竟支持者多行匹配; log error 级别的墨水栈,warn 和 info 可不墨水模板; 可转化确立误解码采用: 四、errgroup 都有误解处置

官方网南站的 ErrGroup 非常简单,似乎就是解决小型多战斗任务模版战斗任务。基本用词 golang.org/x/sync/errgroup 包内定义出了一个 Group struct,它就是我们要介绍的 ErrGroup 模版原语,中下层也是基于 WaitGroup 实现的。在采用 ErrGroup 时,我们要里用三个方法有,分别是 WithContext、Go 和 Wait。

4.1 背景 通常,在读到业务范围示例稳定性优化时特别将一个通用的弟战斗任务另加几个小战斗任务模版可执行。此时须要将一个大的战斗任务另加几个小战斗任务模版可执行,来大大提高QPS,我们须要不须业务范围示例里嵌入所列直觉,但这种方型式为发挥作用难题: 每个劝告都重启 goroutinue,就会有一定的稳定性开销。 野生的 goroutinue,生活史管理非常困难。 收到十分相似 SIGQUIT 信号时,无法平滑终止。 4.2errgroup参数签名 type Group func WithContext(ctx context.Context) (*Group, context.Context) func (g *Group) Go(f func error) func (g *Group) Wait error

整个包内就一个 Group 形态锥体

通过 WithContext 可以创另建一个带撤除的 Group 当然除此都有也可以零值的 Group 也可以这样一来采用,但是错误便就不就会撤除其他的 goroutine 了 Go 方法有传入一个 func error 内部就会启动时一个 goroutine 去处置 Wait 十分相似 WaitGroup 的 Wait 方法有,等待所有的 goroutine 结束后终止,赶回的误解是一个错误的 err 4.3 采用与此就其

特别注意这里有一个东北侧,在后面的示例里免得把 ctx 当好好弟 context 又让给北岸,因为 errgroup 撤除了,这个 context 就不对了,就会引发北岸适配的时候错误

func TestErrgroup { eg, ctx := errgroup.WithContext(context.Background) for i := 0 i < 100 i++ { i := i eg.Go(func error { time.Sleep(2 * time.Second) select { case <-ctx.Done: fmt.Println(CoquotCanceled:", i) return nil default: fmt.Println(CoquotEnd:", i) return nil }})} if err := eg.Wait err != nil { log.Fatal(err) }} 4.4errgroup拓展包内

B 南站拓展包内

相对于官方网南站的形态,B 南站的形态多出了一个参数签名燃气和一个参数签名薄片,并把 Context 这样一来装进了赶回的 Group 形态,赶回仅赶回一个 Group 形态操作符。 type Group struct { err error wg sync.WaitGroup errOnce sync.Once workerOnce sync.Once ch chan func(ctx context.Context) error chs []func(ctx context.Context) error ctx context.Context cancel func}func WithContext(ctx context.Context) *Group { return CoampGroup{ctx: ctx}} Go 方法有可以看出并不是这样一来起协程的(如果燃气已经绑定好了),而是优不须将参数签名装进燃气,燃气如果满了就装进薄片。 func (g *Group) Go(f func(ctx context.Context) error) { g.wg.Add(1) if g.ch != nil { select { case g.ch <- f: default: g.chs = append(g.chs, f) } return } go g.do(f)} GOMAXPROCS参数似乎是起了一个模版池边来依靠协程生产比率,传入最大协程生产比率来进行模版消费行为燃气里的参数签名 func (g *Group) GOMAXPROCS(n int) { if n <= 0 { panic(Coquoterrgroup: GOMAXPROCS must great than 0") } g.workerOnce.Do(func { g.ch = make(chan func(context.Context) error, n) for i := 0 i < n i++ { go func { for f := range g.ch { g.do(f) } } } })}

整个流程梳理仍然似乎就是启动时一个固定生产比率的模版池边消费行为战斗任务,Go 参数似乎是向燃气里发送战斗任务的生产者,这个设计者里有意思的是他的协程生活史的依靠,他的依靠方型式为是每发送一个战斗任务都来进行 WaitGroup 加一,在最后结束时的 wait 参数里来进行等待,等待所有的劝告都处置完才就会封闭燃气,返出误解。

tips:

B 南站拓展包内主要解决了官方网南站 ErrGroup 的几个痛点 1. 依靠模版比率。2.Recover 长住协程的 Panic 并打出模板资讯。 Go 方法有模版的去绑定在比率很多的情况下就会显现出解释器,因为他的薄片不是绑定公共安全的,如果要模版,模版生产比率一定必须过大,一旦动用了战斗任务薄片,那么很有似乎就在 wait 方法有那里 hold 长住了。这个可以加个锁来优化。 Wg watigroup 只在 Go 方法有里来进行 Add,并没有人依靠消费行为者的模版,Wait 的直觉就是分发者都分发完成,这样一来封闭燃气,让消费行为者模版池边自费销毁,不去防范,一旦直觉里有无论如何 hold 长住的方法有那么较难显现出缓存泄漏。。

三精葡萄糖酸锌
儿童便秘
腰间盘突出的治疗方法
301医院干细胞权威专家
红草止鼾多少钱
安必丁是激素药吗
鼻窦炎能用阿莫西林克拉维酸钾片吗
药店买的红草止鼾效果怎么样
十二指肠溃疡能否吃新必奇蒙脱石散
消痔软膏的功效与作用
标签:出发点
友情链接: