Golang之错误处理
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之错误处理相关推荐
- 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 ...
- 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 原因 ...
- call stack是什么错误_Go语言(golang)的错误(error)处理的推荐方案
原文链接:https://www.flysnow.org/2019/01/01/golang-error-handle-suggestion.html 微信公众号:flysnow_org(飞雪无情) ...
- golang 编译错误:unknown revision xxx
go mod处理第三方依赖包时出现unknown revision xxx错误. 原因:github上面的一些开源组件,用的git版本是最新的版本. 而编辑机的git版本比较旧,有的git命令没有,导 ...
- golang mysql 错误 sql: unknown driver “mysql“ (forgotten import?) 解决方法
golang中使用gorm连接mysql的时候会报错:sql: unknown driver "mysql" (forgotten import?) 需要在连接数据库的文件中引入 ...
- golang网站错误处理
我们的Web应用一旦上线之后,那么各种错误出现的概率都有,Web应用日常运行中可能出现多种错误,具体如下所示: 数据库错误:指与访问数据库服务器或数据相关的错误.例如,以下可能出现的一些数据库错误. ...
- Golang的错误处理笔记
错误处理 看一段代码,因此错误处理 在默认情况下,当发生错误后(panic) ,程序就会退出(崩溃.) 如果我们希望:当发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行.还可 以在捕获到错 ...
- golang channel错误 send to non-chan type int/string
ch <- v // 表将v发送到ch中 <-ch // 表从ch接收一个值 v := <-ch // 表从ch接收一个值并存在新的变量v中 易错的地方在于: var v int v ...
- golang 赋值错误 no new variables on left side of :=
1.不同于常规变量声明,在相同块中且至少有一个非空白变量的短变量声明中,可对原先声明的变量以相同的类型重声明.因此,重声明只能出现在多变量的短声明中. 重声明不能生成新的变量:它只能赋予新的值给原来的 ...
最新文章
- 《C#多线程编程实战(原书第2版)》——第3章 使用线程池 3.1 简介
- 64位IIS(IIS6/IIS7)上跑Asp + Jet.Oledb的设置要点
- tensorflow2.0的cpu与gpu运行时间对比
- Java非访问修饰符
- mingw64 下 java_在 Windows 10 64 位下安装 Mingw-w64
- Java 借助ImageMagic实现图片编辑服务
- Python大数据依赖包安装
- Bailian2796 Bailian3681 数字求和【序列处理】
- 状态管理模式 — Vuex如何使用?
- python操作数据库的几种方法_Python操作MySQL数据库的三种方法总结
- html怎么将坐标轴变成百分比,Excel中进行设置双坐标及次坐标轴显示百分比的方法...
- C++系列中的一些修修补补
- 雅思口语考官常问的100个话题整理-自己整理
- 点云 数据增强(Data Augmentation):方法与python代码
- Conlletion集合框架总结大全
- 惠州 菜鸟机器人_马云在惠州建了一个“秘密基地”,超震撼!
- LDAP中CN,OU,DC的含义
- 最新版的sweetalert路径
- meethigher-定时刷步数收取蚂蚁森林能量
- n9006 android6,三星N9006怎么用 三星N9006使用方法【详解】