您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何理解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的模式”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。