最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go高級(jí)特性探究之recover捕獲panic詳解

 更新時(shí)間:2023年06月06日 11:01:41   作者:tracy小貓  
在Go語言中,當(dāng)程序出現(xiàn)panic(即運(yùn)行時(shí)錯(cuò)誤)時(shí),程序會(huì)立即停止當(dāng)前的執(zhí)行流程,而recover函數(shù)的作用就是捕獲這個(gè)panic,下面就來看看具體是怎么操作的吧

在Go語言中,當(dāng)程序出現(xiàn)panic(即運(yùn)行時(shí)錯(cuò)誤)時(shí),程序會(huì)立即停止當(dāng)前的執(zhí)行流程,并在函數(shù)調(diào)用堆棧向上逐層返回,直到遇到recover函數(shù)或程序終止為止。

而recover函數(shù)的作用就是捕獲這個(gè)panic,并恢復(fù)正常的執(zhí)行流程。在Gin框架中,提供了recover中間件來自動(dòng)捕獲panic,并轉(zhuǎn)換為HTTP 500錯(cuò)誤返回給客戶端。

使用

使用recover中間件非常簡(jiǎn)單,只需要在Gin路由中添加即可:

router := gin.Default()
router.Use(gin.Recovery())

需要注意的是,recover中間件應(yīng)該在Gin路由中的第一個(gè)聲明,以確??梢圆东@所有的panic。

配合日志打印與埋點(diǎn)上報(bào)

在API開發(fā)中,當(dāng)用戶請(qǐng)求接口時(shí),有時(shí)候會(huì)遇到一些問題,如訪問url錯(cuò)誤、參數(shù)錯(cuò)誤、數(shù)據(jù)庫連接超時(shí)等。雖然recover中間件可以避免由程序錯(cuò)誤導(dǎo)致的panic,但仍然需要記錄這些錯(cuò)誤信息來協(xié)助問題的排查和定位。

因此,我們可以配合日志打印和埋點(diǎn)上報(bào)來記錄這些錯(cuò)誤。以日志打印為例,Gin框架提供了官方的Logger中間件,可以使用Logger來記錄錯(cuò)誤信息:

router := gin.Default()
// Logger 中間件將請(qǐng)求的URL、響應(yīng)時(shí)間、響應(yīng)狀態(tài)碼和請(qǐng)求的IP地址寫入日志文件
router.Use(gin.Logger())
// Recover 中間件將 panic 轉(zhuǎn)換為 500 錯(cuò)誤,并寫入日志文件
router.Use(gin.Recovery())
// 業(yè)務(wù)代碼
router.GET("/api", func(c \*gin.Context) {
? ? // code
? ? if err != nil {
? ? ? ? // 某個(gè)函數(shù)拋出了 panic
? ? ? ? log.Printf("\[ERROR] - %v\n", err)
? ? ? ? c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
? ? ? ? ? ? "message": "內(nèi)部錯(cuò)誤,請(qǐng)稍后重試",
? ? ? ? })
? ? ? ? return
? ? }
? ? // code
})

在上述代碼中,我們使用log來記錄錯(cuò)誤信息,并在響應(yīng)中返回了錯(cuò)誤提示。這樣我們就能及時(shí)的發(fā)現(xiàn)問題并進(jìn)行排查了。

當(dāng)然,我們還可以在記錄錯(cuò)誤信息的同時(shí)上傳到埋點(diǎn)工具中,例如Sentry、Zipkin等,來實(shí)現(xiàn)自動(dòng)的錯(cuò)誤上報(bào)和監(jiān)控。

recover在開源項(xiàng)目中的使用

recover中間件在開源項(xiàng)目中廣泛應(yīng)用,例如Prometheus、etcd、Kubernetes等項(xiàng)目中都有使用。

以etcd為例,它使用recover中間件捕獲所有的panic,并在日志中記錄錯(cuò)誤信息,如下所示:

func (s *EtcdServer) recoverAndLog(rctx rpctypes.Context, w http.ResponseWriter, req *http.Request) {
? ? data, err := ioutil.ReadAll(req.Body)
? ? if err != nil {
? ? ? ? writeError(w, rctx, err)
? ? ? ? return
? ? }
? ? defer func() {
? ? ? ? if v := recover(); v != nil {
? ? ? ? ? ? log.Printf("panic: %v", v)
? ? ? ? ? ? writeError(w, rctx, fmt.Errorf("panic: %v", v))
? ? ? ? }
? ? }()
? ? // code
}

在該函數(shù)中,使用了defer關(guān)鍵字調(diào)用recover函數(shù)捕獲panic,并使用log記錄錯(cuò)誤信息并返回錯(cuò)誤提示。

總結(jié)

通過Gin框架中的recover中間件,我們可以方便的捕獲和處理程序運(yùn)行時(shí)的錯(cuò)誤,從而提高了API服務(wù)的穩(wěn)定性和可靠性。同時(shí),配合日志打印和埋點(diǎn)上報(bào),可以更好地記錄錯(cuò)誤信息和輔助問題的排查和解決。在開源項(xiàng)目中,recover中間件也被廣泛應(yīng)用,并幫助了很多項(xiàng)目實(shí)現(xiàn)了穩(wěn)定的運(yùn)行。

到此這篇關(guān)于Go高級(jí)特性探究之recover捕獲panic詳解的文章就介紹到這了,更多相關(guān)Go recover捕獲panic內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang使用Channel組建高并發(fā)HTTP服務(wù)器

    Golang使用Channel組建高并發(fā)HTTP服務(wù)器

    Golang 作為一門高效的語言,在網(wǎng)絡(luò)編程方面表現(xiàn)也非常出色,這篇文章主要介紹了如何使用 Golang 和 Channel 組建高并發(fā) HTTP 服務(wù)器,感興趣的可以了解一下
    2023-06-06
  • Golang使用Swagger文檔教程詳解

    Golang使用Swagger文檔教程詳解

    這篇文章主要為大家詳細(xì)介紹Golang使用Swagger文檔教程的相關(guān)知識(shí),文中通過示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • Golang?errgroup?設(shè)計(jì)及實(shí)現(xiàn)原理解析

    Golang?errgroup?設(shè)計(jì)及實(shí)現(xiàn)原理解析

    這篇文章主要為大家介紹了Golang?errgroup?設(shè)計(jì)及實(shí)現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • GO接收GET/POST參數(shù)及發(fā)送GET/POST請(qǐng)求的實(shí)例詳解

    GO接收GET/POST參數(shù)及發(fā)送GET/POST請(qǐng)求的實(shí)例詳解

    這篇文章主要介紹了GO接收GET/POST參數(shù)及發(fā)送GET/POST請(qǐng)求,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Golang Gorm 更新字段save、update、updates

    Golang Gorm 更新字段save、update、updates

    在gorm中,批量更新操作可以通過使用Update方法來實(shí)現(xiàn),本文主要介紹了Golang Gorm 更新字段save、update、updates,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • golang interface判斷為空nil的實(shí)現(xiàn)代碼

    golang interface判斷為空nil的實(shí)現(xiàn)代碼

    這篇文章主要介紹了golang interface判斷為空nil的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang時(shí)間及時(shí)間戳的獲取轉(zhuǎn)換超全面詳細(xì)講解

    Golang時(shí)間及時(shí)間戳的獲取轉(zhuǎn)換超全面詳細(xì)講解

    說實(shí)話,golang的時(shí)間轉(zhuǎn)化還是很麻煩的,最起碼比php麻煩很多,下面這篇文章主要給大家介紹了關(guān)于golang時(shí)間/時(shí)間戳的獲取與轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 詳解Golang如何實(shí)現(xiàn)支持隨機(jī)刪除元素的堆

    詳解Golang如何實(shí)現(xiàn)支持隨機(jī)刪除元素的堆

    堆是一種非常常用的數(shù)據(jù)結(jié)構(gòu),它能夠支持在O(1)的時(shí)間復(fù)雜度獲取到最大值(或最小值)。本文主要介紹了如何實(shí)現(xiàn)支持O(log(n))隨機(jī)刪除元素的堆,需要的可以參考一下
    2022-09-09
  • Go打包附件內(nèi)容到執(zhí)行文件的方法

    Go打包附件內(nèi)容到執(zhí)行文件的方法

    處于種種原因, 我們不希望這部分額外的內(nèi)容以附件的形式出現(xiàn), 有沒有什么辦法能夠?qū)⒏郊?nèi)容直接打包進(jìn)可執(zhí)行文件中呢,下面小編給大家介紹下Go打包附件內(nèi)容到執(zhí)行文件的方法,感興趣的朋友一起看看吧
    2023-03-03
  • Go和RabbitMQ構(gòu)建高效的消息隊(duì)列系統(tǒng)

    Go和RabbitMQ構(gòu)建高效的消息隊(duì)列系統(tǒng)

    本文主要介紹了使用Go語言和RabbitMQ搭建一個(gè)簡(jiǎn)單的消息隊(duì)列系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01

最新評(píng)論

察雅县| 两当县| 社会| 平果县| 绥滨县| 利辛县| 哈巴河县| 浦北县| 古浪县| 镇原县| 固安县| 苍山县| 宜君县| 德昌县| 榕江县| 临湘市| 青州市| 成安县| 江达县| 保靖县| 五大连池市| 九台市| 澎湖县| 都兰县| 永川市| 乾安县| 晋宁县| 哈尔滨市| 甘孜| 米脂县| 汉阴县| 邓州市| 涿鹿县| 永嘉县| 长宁区| 娄烦县| 新干县| 新宁县| 五台县| 杂多县| 伊宁县|