1、错误只在逻辑的最外层处理一次,底层只返回错误。
2、底层除了返回错误外,要对原始错误进行包装,增加错误信息、调用栈等这些有利于排查的上下文信息。

1、errors包:

//只附加新的信息
func WithMessage(err error, message string) error
如:
if err != nil {errors.WithMessage(err, "could not read config")
}//只附加调用堆栈信息
func WithStack(err error) error//同时附加堆栈和信息
func Wrap(err error, message string) error
如:
if err != nil {return errors.Wrap(err, "open failed")
}// 返回包装错误对应的最原始错误
errors.Cause(err)
如:
fmt.Printf("original error: %T %v\n", errors.Cause(err), errors.Cause(err))

2、Err集中判断:

初始:
// 开车去商店
shopper, err := shopper.Drive(FuelNeededToGetToStore)
if nil != err {log.Fatalf("could not complete shopping: %s", err)
}
// 买鸡蛋
shopper, err = shopper.BuyEggs(EggsRequired)
if nil != err {log.Fatalf("could not complete shopping: %s", err)
}
// 买完鸡蛋开车回家
shopper, err = shopper.Drive(FuelNeededToGetHome)
if nil != err {log.Fatalf("could not complete shopping: %s", err)
}只打印不返回的err集中判断
func main(){shopper, err := shopper.Drive(FuelNeededToGetToStore)FatalIfErrNotNil(err)shopper, err = shopper.BuyEggs(EggsRequired)FatalIfErrNotNil(err)shopper, err = shopper.Drive(FuelNeededToGetHome)FatalIfErrNotNil(err)
}  func FatalIfErrNotNil(err error) {if nil != err {log.Fatalf("could not complete shopping: %s", err)}
}

3、责任链迭代变换

func main(){driveToStore := Flavorize(Drive, FuelNeededToGetToStore)buyEggs := Flavorize(BuyEggs, EggsRequired)driveHome := Flavorize(Drive, FuelNeededToGetHome)shopper, err := ProcessSteps(shopper,driveToStore,buyEggs,driveHome,)if nil != err {log.Fatalf("could not complete shopping: %s", err)}
}func ProcessSteps(s Shopper, steps ...func(Shopper) (Shopper, error)) (Shopper, error) {for _, step := range steps {var err error s, err = step(s)if nil != err {return s, err}}return s, nil
}func Flavorize(f func(Shopper, int) (Shopper, error), arg int) func(Shopper) (Shopper, error) {return func(s Shopper) (Shopper, error) {return f(s, arg)}
}

4、使用defer消除冗余

func writeConfig(data interface{}) (err error) {defer func() {if err != nil {err = errors.WithMessage(err, "writing configuration")}}()b, err := json.Marshal(data)if err != nil {return err}if err = ioutil.WriteFile("config.json", b, 0644); err != nil {return err}return
}

5、

Golang之错误处理相关推荐

  1. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  2. golang编译错误 copying /tmp/go-build069786374/b001/exe/a.out: No such file or directory 解决方法

    问题: linux虚拟机 golang编译 报错 copying /tmp/go-build069786374/b001/exe/a.out: No such file or directory 原因 ...

  3. call stack是什么错误_Go语言(golang)的错误(error)处理的推荐方案

    原文链接:https://www.flysnow.org/2019/01/01/golang-error-handle-suggestion.html 微信公众号:flysnow_org(飞雪无情) ...

  4. golang 编译错误:unknown revision xxx

    go mod处理第三方依赖包时出现unknown revision xxx错误. 原因:github上面的一些开源组件,用的git版本是最新的版本. 而编辑机的git版本比较旧,有的git命令没有,导 ...

  5. golang mysql 错误 sql: unknown driver “mysql“ (forgotten import?) 解决方法

    golang中使用gorm连接mysql的时候会报错:sql: unknown driver "mysql" (forgotten import?) 需要在连接数据库的文件中引入  ...

  6. golang网站错误处理

    我们的Web应用一旦上线之后,那么各种错误出现的概率都有,Web应用日常运行中可能出现多种错误,具体如下所示: 数据库错误:指与访问数据库服务器或数据相关的错误.例如,以下可能出现的一些数据库错误. ...

  7. Golang的错误处理笔记

    错误处理 看一段代码,因此错误处理 在默认情况下,当发生错误后(panic) ,程序就会退出(崩溃.) 如果我们希望:当发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行.还可 以在捕获到错 ...

  8. golang channel错误 send to non-chan type int/string

    ch <- v // 表将v发送到ch中 <-ch // 表从ch接收一个值 v := <-ch // 表从ch接收一个值并存在新的变量v中 易错的地方在于: var v int v ...

  9. golang 赋值错误 no new variables on left side of :=

    1.不同于常规变量声明,在相同块中且至少有一个非空白变量的短变量声明中,可对原先声明的变量以相同的类型重声明.因此,重声明只能出现在多变量的短声明中. 重声明不能生成新的变量:它只能赋予新的值给原来的 ...

最新文章

  1. 《C#多线程编程实战(原书第2版)》——第3章 使用线程池 3.1 简介
  2. 64位IIS(IIS6/IIS7)上跑Asp + Jet.Oledb的设置要点
  3. tensorflow2.0的cpu与gpu运行时间对比
  4. Java非访问修饰符
  5. mingw64 下 java_在 Windows 10 64 位下安装 Mingw-w64
  6. Java 借助ImageMagic实现图片编辑服务
  7. Python大数据依赖包安装
  8. Bailian2796 Bailian3681 数字求和【序列处理】
  9. 状态管理模式 — Vuex如何使用?
  10. python操作数据库的几种方法_Python操作MySQL数据库的三种方法总结
  11. html怎么将坐标轴变成百分比,Excel中进行设置双坐标及次坐标轴显示百分比的方法...
  12. C++系列中的一些修修补补
  13. 雅思口语考官常问的100个话题整理-自己整理
  14. 点云 数据增强(Data Augmentation):方法与python代码
  15. Conlletion集合框架总结大全
  16. 惠州 菜鸟机器人_马云在惠州建了一个“秘密基地”,超震撼!
  17. LDAP中CN,OU,DC的含义
  18. 最新版的sweetalert路径
  19. meethigher-定时刷步数收取蚂蚁森林能量
  20. n9006 android6,三星N9006怎么用 三星N9006使用方法【详解】

热门文章

  1. 图解git原理与日常实用指南
  2. [CF487E]Tourists
  3. GIt本地相关操作(一)
  4. 例子:倒计时按钮可用
  5. php 基础函数写法,字符串,常用函数
  6. MySQL性能调优的14板斧
  7. [转]Open Data Protocol (OData) Basic Tutorial
  8. Cambridge eap essay 1
  9. 挤牙膏机器,实话,没啥用
  10. [20180914]oracle 12c 表 full_hash_value如何计算.txt