返回顶部
首页 > 资讯 > 精选 >如何理解Go错误处理之用panic取代rr != nil的模式
  • 373
分享到

如何理解Go错误处理之用panic取代rr != nil的模式

2023-06-15 20:06:45 373人浏览 薄情痞子
摘要

这篇文章主要介绍“如何理解Go错误处理之用panic取代rr != nil的模式”,在日常操作中,相信很多人在如何理解Go错误处理之用panic取代rr != nil的模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对

这篇文章主要介绍“如何理解Go错误处理之用panic取代rr != nil的模式”,在日常操作中,相信很多人在如何理解Go错误处理之用panic取代rr != nil的模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Go错误处理之用panic取代rr != 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() {  fish2 := GetFish(db, "煎鱼")  fish3 := GetFish(db, "咸鱼")  fish4 := 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 错误链路处理了。

优缺点

  • 从优点上来讲:

    • 整体代码结构看起来更加的简洁,仅专注于实现逻辑即可。

    • 不需要关注和编写冗杂的 if err != nil 的错误处理代码。

  • 从缺点上来讲:

    • 认知负担的增加,需要参加项目的每一个新老同学都清楚该模式,要做一个基本规范或培训。

    • 存在一定的性能开销,每次 panic 都存在用户态的上下文切换。

    • 存在一定的风险性,一旦 panic 没有 recover 住,就会导致事故。

    • Go 官方并不推荐,与 panic 本身的定义相违背,也就是 panic 与 error 的概念混淆。

到此,关于“如何理解Go错误处理之用panic取代rr != nil的模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何理解Go错误处理之用panic取代rr != nil的模式

本文链接: https://lsjlt.com/news/281575.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作