Go全局異常的實(shí)現(xiàn)示例
在 Go 項(xiàng)目開發(fā)中,有效的異常處理是確保程序健壯性和穩(wěn)定性的關(guān)鍵因素之一。全局異常處理機(jī)制能夠統(tǒng)一處理項(xiàng)目中可能出現(xiàn)的各種異常情況,提高代碼的可讀性、可維護(hù)性以及錯(cuò)誤處理的一致性。
一、Go 中的錯(cuò)誤處理機(jī)制
在 Go 語(yǔ)言中,并沒有像其他語(yǔ)言那樣的傳統(tǒng)異常機(jī)制。而是期望開發(fā)者主動(dòng)去識(shí)別處理這種“異常”,通過返回值來表示可能出現(xiàn)的錯(cuò)誤。
通常情況下,函數(shù)會(huì)返回一個(gè)結(jié)果集和一個(gè)錯(cuò)誤值,我們需要判斷錯(cuò)誤值是否為 nil
,如果不為 nil
則表示出現(xiàn)了“異常”。
package main import ( "fmt" ) // 模擬一個(gè)會(huì)返回錯(cuò)誤的函數(shù) func divide(a, b int) (int, error) { if b == 0 { return 0, fmt.Errorf("除數(shù)不能為 0") } return a / b, nil } func main() { result, err := divide(10, 0) if err != nil { fmt.Println("出錯(cuò)啦:", err) return } fmt.Println("結(jié)果是:", result) }
二、Go 中的 panic
當(dāng)程序遇到無(wú)法處理的錯(cuò)誤時(shí),就會(huì)被提示panic
,程序會(huì)直接崩潰。
recover
函數(shù)用于捕獲 panic
拋出的信息,讓程序從 panic 狀態(tài)恢復(fù)繼續(xù)正常執(zhí)行,前提 recover 只能在 defer
函數(shù)中使用。
package main import ( "fmt" ) func main() { defer func() { if r := recover(); r != nil { fmt.Println("已捕獲到恐慌:", r) } }() // 手動(dòng)觸發(fā)一個(gè) panic panic("這是一個(gè)恐慌!") } // 輸出: // 已捕獲到恐慌:這是一個(gè)恐慌!
三、實(shí)現(xiàn)全局異常處理
根據(jù)上述其實(shí)不難發(fā)現(xiàn),錯(cuò)誤處理是顯式的,我們可以做前置判斷,根據(jù)具體情況進(jìn)行處理,但是panic
處理通常是隱式的,一旦被調(diào)用 panic 函數(shù),程序的執(zhí)行流程會(huì)被打亂,需捕獲 panic 才能恢復(fù)程序的正常執(zhí)行。
所以針對(duì)這種隱式的、在編程過程中無(wú)法提前預(yù)知的錯(cuò)誤,就很有必要做一層異常的處理,最好可以是全局處理。
為了實(shí)現(xiàn)全局異常處理,我們可以創(chuàng)建一個(gè)中間件或者全局的異常處理函數(shù)。
func GlobalErrorHandler() gin.HandlerFunc { return func(c *gin.Context) { defer func() { if err := recover(); err!= nil { log.Printf("Recovered from panic: %v", err) c.JSON(500, gin.H{ "message": "Internal Server Error", }) c.Abort() } }() c.Next() } }
四、在項(xiàng)目中的應(yīng)用
在實(shí)際的項(xiàng)目中,我們可以將這個(gè)全局異常處理中間件應(yīng)用到 HTTP 服務(wù)器的路由處理中。
package main import ( "github.com/gin-gonic/gin" "log" ) func main() { r := gin.Default() // 應(yīng)用全局異常處理中間件 r.Use(GlobalErrorHandler()) r.GET("/ping", func(c *gin.Context) { // 模擬異常 panic("Something went wrong!") }) r.Run(":8080") }
這樣下來,在程序的后續(xù)處理中,一旦遇到 panic 就會(huì)被捕獲,從而不影響程序的繼續(xù)運(yùn)行。
到此這篇關(guān)于Go全局異常的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go 全局異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go并發(fā)編程實(shí)現(xiàn)數(shù)據(jù)競(jìng)爭(zhēng)
本文主要介紹了Go并發(fā)編程實(shí)現(xiàn)數(shù)據(jù)競(jìng)爭(zhēng),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Go語(yǔ)言操作Excel利器之excelize類庫(kù)詳解
Excelize是Go語(yǔ)言編寫的用于操作Office Excel文檔基礎(chǔ)庫(kù),基于ECMA-376,ISO/IEC 29500國(guó)際標(biāo)準(zhǔn),可以使用它來讀取、寫入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言操作Excel利器之excelize類庫(kù)的相關(guān)資料,需要的朋友可以參考下2022-10-10Golang TCP網(wǎng)絡(luò)編程的具體實(shí)現(xiàn)
go語(yǔ)言是一門功能強(qiáng)大的編程語(yǔ)言,它提供了眾多的網(wǎng)絡(luò)編程庫(kù),其中包括tcp/ip,本文主要介紹了Golang TCP網(wǎng)絡(luò)編程的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以來了解一下2024-06-06go語(yǔ)言數(shù)據(jù)類型之字符串string
這篇文章介紹了go語(yǔ)言數(shù)據(jù)類型之字符串string,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口的示例代碼
滑動(dòng)時(shí)間窗口就是把一段時(shí)間片分為多個(gè)樣本窗口,可以通過更細(xì)粒度對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),這篇文章主要介紹了golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口,需要的朋友可以參考下2022-10-10GO語(yǔ)言創(chuàng)建錢包并遍歷錢包(wallet)的實(shí)現(xiàn)代碼
比特幣錢包實(shí)際上是一個(gè)密鑰對(duì),當(dāng)你安裝 一個(gè)錢包應(yīng)用,或者是使用一個(gè)比特幣客戶端來生成一個(gè)新地址是,他就會(huì)為你生成一個(gè)密鑰對(duì),今天通過本文給大家分享go語(yǔ)言遍歷錢包的相關(guān)知識(shí),一起看看吧2021-05-05