本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼 。转载本文请联系脑子进煎鱼了公众号。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都做网站、可克达拉网络推广、小程序定制开发、可克达拉网络营销、可克达拉企业策划、可克达拉品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供可克达拉建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
大家好,我是煎鱼。
前段时间我分享了文章 《先睹为快,Go2 Error 的挣扎之路》后,和一位朋友进行了一次深度交流,他给我分享了他们项目组对于 Go 错误处理的方式调整。
简单来讲,就是在业务代码中使用 panic 的方式来替代 “永无止境” 的 if err != nil。
我们一起来看看是怎么做,又有什么优缺点,互相学习一轮。
为什么想替换
在 Go 语言中 if err != nil 写的太多,还要管方法声明各种,嫌麻烦又不方便:
- err := foo()
- if err != nil {
- //do something..
- return err
- }
- err := foo()
- if err != nil {
- //do something..
- return err
- }
- err := foo()
- if err != nil {
- //do something..
- return err
- }
- err := foo()
- if err != nil {
- //do something..
- return err
- }
上述还是示例代码,比较直面。若是在工程实践,还得各种 package 跳来跳去加 if err != nil,讲更繁琐,要去关心整体的上下游。
其余更具体的就不赘述了,可以关注我的公众号翻看先前的文章。
怎么替换 err != nil
不想写 if err != nil 的代码,方式之一就是用 panic 来替代他。
示例代码如下:
- func GetFish(db *sql.DB, name string) []string {
- rows, err := db.Query("select name from users where `name` = ?", name)
- if err != nil {
- panic(err)
- }
- defer rows.Close()
- var names []string
- for rows.Next() {
- var name string
- err := rows.Scan(&name)
- if err != nil {
- panic(err)
- }
- names = append(names, name)
- }
- err = rows.Err()
- if err != nil {
- panic(err)
- }
- return names
- }
在上述业务代码中,我们通过 panic 的方式取代了 return err 的函数返回,自然其所关联的下游业务代码也就不需要编写 if err != nil 的代码:
- func main() {
- fish1 := GetFish(db, "煎鱼")
- fish2 := GetFish(db, "咸鱼")
- fish3 := GetFish(db, "摸鱼")
- ...
- }
同时在转换为使用 panic 模式的错误机制后,我们必须要在外层增加 recover 方法:
- func AppRecovery() gin.HandlerFunc {
- return func(c *gin.Context) {
- defer func() {
- if err := recover(); err != nil {
- if _, ok := err.(AppErr); ok {
- // do something...
- } else {
- panic(err)
- }
- }
- }()
- }
- }
每次 panic 后根据其抛出的错误进行断言,识别是否定制的 AppErr 错误类型,若是则可以进行一系列的处理动作。
否则可继续向上 panic 抛出给顶级的 Recovery 方法进行处理。
这就是一个相对完整的 panic 错误链路处理了。
优缺点
总结
在今天这篇文章给大家分享了如何使用 panic 的方式来处理 Go 的错误,其必然有利必有有弊,需要做一个权衡了。
本文名称:Go错误处理:用panic取代err!=nil的模式
地址分享:http://www.shufengxianlan.com/qtweb/news20/158020.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联