Go全局異常的實(shí)現(xiàn)示例
在 Go 項(xiàng)目開(kāi)發(fā)中,有效的異常處理是確保程序健壯性和穩(wěn)定性的關(guān)鍵因素之一。全局異常處理機(jī)制能夠統(tǒng)一處理項(xiàng)目中可能出現(xiàn)的各種異常情況,提高代碼的可讀性、可維護(hù)性以及錯(cuò)誤處理的一致性。
一、Go 中的錯(cuò)誤處理機(jī)制
在 Go 語(yǔ)言中,并沒(méi)有像其他語(yǔ)言那樣的傳統(tǒng)異常機(jī)制。而是期望開(kāi)發(fā)者主動(dòng)去識(shí)別處理這種“異常”,通過(guò)返回值來(lái)表示可能出現(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ì)這種隱式的、在編程過(guò)程中無(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")
}
這樣下來(lái),在程序的后續(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),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Go語(yǔ)言操作Excel利器之excelize類(lèi)庫(kù)詳解
Excelize是Go語(yǔ)言編寫(xiě)的用于操作Office Excel文檔基礎(chǔ)庫(kù),基于ECMA-376,ISO/IEC 29500國(guó)際標(biāo)準(zhǔn),可以使用它來(lái)讀取、寫(xiě)入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言操作Excel利器之excelize類(lèi)庫(kù)的相關(guān)資料,需要的朋友可以參考下2022-10-10
Golang TCP網(wǎng)絡(luò)編程的具體實(shí)現(xiàn)
go語(yǔ)言是一門(mén)功能強(qiáng)大的編程語(yǔ)言,它提供了眾多的網(wǎng)絡(luò)編程庫(kù),其中包括tcp/ip,本文主要介紹了Golang TCP網(wǎng)絡(luò)編程的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以來(lái)了解一下2024-06-06
go語(yǔ)言數(shù)據(jù)類(lèi)型之字符串string
這篇文章介紹了go語(yǔ)言數(shù)據(jù)類(lèi)型之字符串string,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口的示例代碼
滑動(dòng)時(shí)間窗口就是把一段時(shí)間片分為多個(gè)樣本窗口,可以通過(guò)更細(xì)粒度對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),這篇文章主要介紹了golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口,需要的朋友可以參考下2022-10-10
GO語(yǔ)言創(chuàng)建錢(qián)包并遍歷錢(qián)包(wallet)的實(shí)現(xiàn)代碼
比特幣錢(qián)包實(shí)際上是一個(gè)密鑰對(duì),當(dāng)你安裝 一個(gè)錢(qián)包應(yīng)用,或者是使用一個(gè)比特幣客戶端來(lái)生成一個(gè)新地址是,他就會(huì)為你生成一個(gè)密鑰對(duì),今天通過(guò)本文給大家分享go語(yǔ)言遍歷錢(qián)包的相關(guān)知識(shí),一起看看吧2021-05-05

