av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

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

本文轉(zhuǎn)載自微信公眾號(hào)「腦子進(jìn)煎魚(yú)了」,作者陳煎魚(yú) 。轉(zhuǎn)載本文請(qǐng)聯(lián)系腦子進(jìn)煎魚(yú)了公眾號(hào)。  

創(chuàng)新互聯(lián)專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、可克達(dá)拉網(wǎng)絡(luò)推廣、小程序定制開(kāi)發(fā)、可克達(dá)拉網(wǎng)絡(luò)營(yíng)銷(xiāo)、可克達(dá)拉企業(yè)策劃、可克達(dá)拉品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪(fǎng)、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供可克達(dá)拉建站搭建服務(wù),24小時(shí)服務(wù)熱線(xiàn):18980820575,官方網(wǎng)址:www.cdcxhl.com

 大家好,我是煎魚(yú)。

前段時(shí)間我分享了文章 《先睹為快,Go2 Error 的掙扎之路》后,和一位朋友進(jìn)行了一次深度交流,他給我分享了他們項(xiàng)目組對(duì)于 Go 錯(cuò)誤處理的方式調(diào)整。

簡(jiǎn)單來(lái)講,就是在業(yè)務(wù)代碼中使用 panic 的方式來(lái)替代 “永無(wú)止境” 的 if err != nil。

我們一起來(lái)看看是怎么做,又有什么優(yōu)缺點(diǎn),互相學(xué)習(xí)一輪。

為什么想替換

在 Go 語(yǔ)言中 if err != nil 寫(xiě)的太多,還要管方法聲明各種,嫌麻煩又不方便:

 
 
 
  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 

上述還是示例代碼,比較直面。若是在工程實(shí)踐,還得各種 package 跳來(lái)跳去加 if err != nil,講更繁瑣,要去關(guān)心整體的上下游。

其余更具體的就不贅述了,可以關(guān)注我的公眾號(hào)翻看先前的文章。

怎么替換 err != nil

不想寫(xiě) if err != nil 的代碼,方式之一就是用 panic 來(lái)替代他。

示例代碼如下:

 
 
 
  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 

在上述業(yè)務(wù)代碼中,我們通過(guò) panic 的方式取代了 return err 的函數(shù)返回,自然其所關(guān)聯(lián)的下游業(yè)務(wù)代碼也就不需要編寫(xiě) if err != nil 的代碼:

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

同時(shí)在轉(zhuǎn)換為使用 panic 模式的錯(cuò)誤機(jī)制后,我們必須要在外層增加 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 后根據(jù)其拋出的錯(cuò)誤進(jìn)行斷言,識(shí)別是否定制的 AppErr 錯(cuò)誤類(lèi)型,若是則可以進(jìn)行一系列的處理動(dòng)作。

否則可繼續(xù)向上 panic 拋出給頂級(jí)的 Recovery 方法進(jìn)行處理。

這就是一個(gè)相對(duì)完整的 panic 錯(cuò)誤鏈路處理了。

優(yōu)缺點(diǎn)

  • 從優(yōu)點(diǎn)上來(lái)講:
    • 整體代碼結(jié)構(gòu)看起來(lái)更加的簡(jiǎn)潔,僅專(zhuān)注于實(shí)現(xiàn)邏輯即可。
    • 不需要關(guān)注和編寫(xiě)冗雜的 if err != nil 的錯(cuò)誤處理代碼。
  • 從缺點(diǎn)上來(lái)講:
    • 認(rèn)知負(fù)擔(dān)的增加,需要參加項(xiàng)目的每一個(gè)新老同學(xué)都清楚該模式,要做一個(gè)基本規(guī)范或培訓(xùn)。
    • 存在一定的性能開(kāi)銷(xiāo),每次 panic 都存在用戶(hù)態(tài)的上下文切換。
    • 存在一定的風(fēng)險(xiǎn)性,一旦 panic 沒(méi)有 recover 住,就會(huì)導(dǎo)致事故。
    • Go 官方并不推薦,與 panic 本身的定義相違背,也就是 panic 與 error 的概念混淆。

總結(jié)

在今天這篇文章給大家分享了如何使用 panic 的方式來(lái)處理 Go 的錯(cuò)誤,其必然有利必有有弊,需要做一個(gè)權(quán)衡了。


名稱(chēng)欄目:Go錯(cuò)誤處理:用panic取代err!=nil的模式
文章路徑:http://uogjgqi.cn/article/djgdsgi.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流