1.异常(内存溢出或者内存越界)
- 空指针引用时
- 数组或者切片下标越界
- 除0错误
- 出现业务上严格不应该出现的判断分支
- 输入非法值引起函数错误
- 在程序开发阶段,坚持速错
- 在程序部署后,应恢复异常避免程序终止
- 针对入参不应该有问题的函数,使用panic设计
2.错误
- 当失败原因只有一个时,不应该使用error,应该用代表操作状态的变量代替返回
- 当一个函数不可能出现失败时,不能使用error作为返回,属于过度处理
- error应该放在函数返回值的最后一个,golang编码规范,保证和官方错误处理设计一致性
- 错误值统一定义,防止错误定义在项目中满天飞,必须将所有的错误定义统一在一个error文件或者一个error目录下
- 错误逐层传递时,层层都加日志,不能认为这个错误在某一个函数下面已经处理过了调用方不需要在重复处理该错误,这样做是不正确的,错误处理应该是自下而上的,层层处理
- 错误处理使用defer,尽量在一个函数内统一使用defer机制统一处理,这样好处是编码容错率高,而且由于defer的机制,defer处理的永远是函数内部最新的err值,符合错误处理的逻辑设计思想
- 当尝试几次可以避免失败时,不要立即返回错误,如果错误的发生是偶然性的,或由不可预知的问题导致。一个明智的选择是重新尝试失败的操作,有时第二次或第三次尝试时会成功。在重试时,我们需要限制重试的时间间隔或重试的次数,防止无限制的重试
- 当上层函数不关心错误时,建议不返回error, 避免过度编码,增加不必要的编码复杂度,大大降低代码可读性
- 当发生错误时,不能忽略有用的返回值,应该将读取到的值和错误信息一起打印出来, 对函数的返回值要有清晰的说明,以便于其他人使用