成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 錯誤處理:用 panic 取代 err != nil 的模式

開發 后端
簡單來講,就是在業務代碼中使用 panic 的方式來替代 “永無止境” 的 if err != nil。我們一起來看看是怎么做,又有什么優缺點,互相學習一輪。

[[358217]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚 。轉載本文請聯系腦子進煎魚了公眾號。  

 大家好,我是煎魚。

前段時間我分享了文章 《先睹為快,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 錯誤鏈路處理了。

優缺點

  • 從優點上來講:
    • 整體代碼結構看起來更加的簡潔,僅專注于實現邏輯即可。
    • 不需要關注和編寫冗雜的 if err != nil 的錯誤處理代碼。
  • 從缺點上來講:
    • 認知負擔的增加,需要參加項目的每一個新老同學都清楚該模式,要做一個基本規范或培訓。
    • 存在一定的性能開銷,每次 panic 都存在用戶態的上下文切換。
    • 存在一定的風險性,一旦 panic 沒有 recover 住,就會導致事故。
    • Go 官方并不推薦,與 panic 本身的定義相違背,也就是 panic 與 error 的概念混淆。

總結

在今天這篇文章給大家分享了如何使用 panic 的方式來處理 Go 的錯誤,其必然有利必有有弊,需要做一個權衡了。

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2025-02-24 09:30:15

2025-03-31 00:29:44

2025-03-31 08:57:25

Go程序性能

2024-06-05 08:47:20

Go語言方式

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

語言Go 處理

2023-03-10 08:48:29

2024-02-28 08:54:57

switchGo錯誤

2025-05-22 09:01:28

2022-06-13 07:03:25

Go 語言怎么優化重

2025-06-06 06:45:54

2021-09-13 07:53:31

Go錯誤處理

2022-09-05 08:55:15

Go2提案語法

2022-05-26 08:53:47

Go函數代碼

2024-03-14 09:35:54

Go 錯誤select代碼

2021-09-27 15:33:48

Go 開發技術

2023-10-26 15:49:53

Go日志

2021-09-27 23:28:29

Go多協程并發

2021-09-27 10:04:03

Go程序處理

2021-04-14 07:08:14

Nodejs錯誤處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区精品视频 | 国产精品美女www | 国产一级片 | 国产精品国产三级国产播12软件 | 久久中文字幕一区 | 一区二区免费 | 国产在线一区二区三区 | 91在线视频国产 | 九九99精品| 一区二区三区免费 | 色综合久久久 | 日韩一区中文字幕 | 国产美女精品 | 国产精品自产av一区二区三区 | 亚洲欧美激情四射 | 在线视频日韩精品 | 福利网站在线观看 | 国产精品色综合 | 亚洲一区二区三区桃乃木香奈 | 欧美日韩亚 | 国产麻豆乱码精品一区二区三区 | 天天爱综合| 在线播放国产一区二区三区 | 综合网在线 | 99久久精品免费看国产四区 | 亚洲精品福利视频 | xxx国产精品视频 | 国产yw851.c免费观看网站 | www.玖玖玖| 亚洲精品日韩精品 | 毛片黄 | 午夜激情影院 | 二区视频 | 日本成人在线播放 | 一级aaaa毛片| 成人国产精品久久久 | 亚洲免费在线 | 最新中文字幕在线 | 亚洲视频中文字幕 | 亚洲精选一区二区 | 午夜三级网站 |