文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go 错误处理:用 panic 取代 err != nil 的模式

2024-12-03 15:02

关注

本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼 。转载本文请联系脑子进煎鱼了公众号。  

 大家好,我是煎鱼。

前段时间我分享了文章 《先睹为快,Go2 Error 的挣扎之路》后,和一位朋友进行了一次深度交流,他给我分享了他们项目组对于 Go 错误处理的方式调整。

简单来讲,就是在业务代码中使用 panic 的方式来替代 “永无止境” 的 if err != nil。

我们一起来看看是怎么做,又有什么优缺点,互相学习一轮。

为什么想替换

在 Go 语言中 if err != nil 写的太多,还要管方法声明各种,嫌麻烦又不方便:

  1. err := foo() 
  2. if err != nil { 
  3.      //do something.. 
  4.      return err 
  5.  
  6. err := foo() 
  7. if err != nil { 
  8.      //do something.. 
  9.      return err 
  10.  
  11. err := foo() 
  12. if err != nil { 
  13.      //do something.. 
  14.      return err 
  15.  
  16. err := foo() 
  17. if err != nil { 
  18.      //do something.. 
  19.      return err 

上述还是示例代码,比较直面。若是在工程实践,还得各种 package 跳来跳去加 if err != nil,讲更繁琐,要去关心整体的上下游。

其余更具体的就不赘述了,可以关注我的公众号翻看先前的文章。

怎么替换 err != nil

不想写 if err != nil 的代码,方式之一就是用 panic 来替代他。

示例代码如下:

  1. func GetFish(db *sql.DB, name string) []string { 
  2.  rows, err := db.Query("select name from users where `name` = ?"name
  3.  if err != nil { 
  4.   panic(err) 
  5.  } 
  6.  defer rows.Close() 
  7.  
  8.  var names []string 
  9.  for rows.Next() { 
  10.   var name string 
  11.   err := rows.Scan(&name
  12.   if err != nil { 
  13.    panic(err) 
  14.   } 
  15.  
  16.   names = append(names, name
  17.  } 
  18.  
  19.  err = rows.Err() 
  20.  if err != nil { 
  21.   panic(err) 
  22.  } 
  23.  
  24.  return names 

在上述业务代码中,我们通过 panic 的方式取代了 return err 的函数返回,自然其所关联的下游业务代码也就不需要编写 if err != nil 的代码:

  1. func main() { 
  2.  fish1 := GetFish(db, "煎鱼"
  3.  fish2 := GetFish(db, "咸鱼"
  4.  fish3 := GetFish(db, "摸鱼"
  5.  ... 

同时在转换为使用 panic 模式的错误机制后,我们必须要在外层增加 recover 方法:

  1. func AppRecovery() gin.HandlerFunc { 
  2.  return func(c *gin.Context) { 
  3.   defer func() { 
  4.    if err := recover(); err != nil { 
  5.     if _, ok := err.(AppErr); ok { 
  6.      // do something... 
  7.     } else { 
  8.      panic(err) 
  9.     } 
  10.    } 
  11.   }() 
  12.  } 

每次 panic 后根据其抛出的错误进行断言,识别是否定制的 AppErr 错误类型,若是则可以进行一系列的处理动作。

否则可继续向上 panic 抛出给顶级的 Recovery 方法进行处理。

这就是一个相对完整的 panic 错误链路处理了。

优缺点

总结

在今天这篇文章给大家分享了如何使用 panic 的方式来处理 Go 的错误,其必然有利必有有弊,需要做一个权衡了。

 

来源:脑子进煎鱼了内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯