编码规范五 | 青训营笔记

96 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

错误和异常处理

概述

前面提到的是程序大多数情况下运行时的规范,但是实际程序运行时,难免会遇到错误或异常情况,需要如何处理呢。这部分就介绍错误和异常处理的相关规范。

简单错误

简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误,优先使用errors.New来创建匿名变量直接表示简单错误。如果有格式化的需求,使用fmt.Error。

错误的Wrap和Unwrap

错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链,在fmt.Error中使用:%w关键字来将一个错误关联至错误链里。

go1.13版本errors里新加三个新ap和一个新的format关键字,分别是errors.is,errors.as,errors.unwrap,如果项目运行在小于go1.13的版本里,导入来使用golang.org/x/xerrors。

错误判定

如果错误是一套错误链我们该如何处理呢。

判定一个错误是否为特定错误,使用errors.is

不同于使用==,使用该方法可以判定错误链上的所有错误是否含有特定的错误。

在错误链上获取特定的种类的错误,使用errors.as

panic

不建议在业务代码里使用panic,调用函数不包含recover会影响程序崩溃。若问题可以被屏蔽或解决,建议使用error代替panic。当程序启动阶段发生不可逆的错误时,可以在init或main函数里面使用panic。

recover

recover只能在被defer的函数中使用,嵌套无法生效,只能当前的goroutine生效,defer的语句时后进先出。如果需要更多的上下文信息,可以recover后的log里面记录当前的调用栈。

小结

error尽可能提供简明的上下文信息链,方便定位问题,panic用于真正异常的情况,recover生效范围,在当前goroutine的被dafer的函数中生效。