欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go gin框架處理panic的方法詳解

 更新時(shí)間:2023年09月28日 10:24:17   作者:林欣快滾去學(xué)習(xí)  
本文我們介紹下recover在gin框架中的應(yīng)用, 首先,在golang中,如果在子協(xié)程中遇到了panic,那么主協(xié)程也會被終止,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下

本文我們介紹下recover在gin框架中的應(yīng)用。 首先,在golang中,如果在子協(xié)程中遇到了panic,那么主協(xié)程也會被終止。如下:

package main
import (
	"github.com/gin-gonic/gin"
)
func main() {
	r := gin.Default()
    // 在子協(xié)程中引起panic,主協(xié)程也會退出
	go func() {
		panic("hello world")
	}()
	// Listen and Server in 0.0.0.0:8080
	r.Run(":8080")
}

panic被描述為不可處理的錯誤。在web服務(wù)中就是服務(wù)會崩潰。當(dāng)然,這在生產(chǎn)環(huán)境下是不可接受的。那么,如何能夠做到發(fā)生panic時(shí)技能捕獲該panic又能讓服務(wù)繼續(xù)健康運(yùn)行呢?

這就是golang中提供的recover函數(shù)了。recover函數(shù)能夠捕獲Panic錯誤并恢復(fù)程序的正常運(yùn)行。

接下來,我們看下recover函數(shù)在gin框架中是如何應(yīng)用的。

首先,要提到的就是gin框架中的recovery中間件。在gin中,是通過使用該中間件來捕獲panic,并保證服務(wù)不down機(jī)的。 如果使用gin.Default()函數(shù)進(jìn)行構(gòu)建gin對象,那么默認(rèn)就注冊了Recovery中間件。

func Default() *Engine {
	debugPrintWARNINGDefault()
	engine := New()
    //  注冊了Recovery中間件
	engine.Use(Logger(), Recovery())
	return engine
}

其次,我們來看下Recovery()中間件都做了些什么。

Recovery()函數(shù)定義如下:

func Recovery() HandlerFunc {
	return RecoveryWithWriter(DefaultErrorWriter)
}

這里的DefaultErrorWriter是默認(rèn)的輸出端,即os.Stderr。即指錯誤的輸出到什么地方。

接下來看RecoveryWithWriter函數(shù)中的實(shí)現(xiàn)

// RecoveryWithWriter returns a middleware for a given writer that recovers from any panics and writes a 500 if there was one.
func RecoveryWithWriter(out io.Writer, recovery ...RecoveryFunc) HandlerFunc {
	if len(recovery) > 0 {
		return CustomRecoveryWithWriter(out, recovery[0])
	}
	return CustomRecoveryWithWriter(out, defaultHandleRecovery)
}

這里有一個(gè)參數(shù)是defaultHandleRecovery,我們看下它的實(shí)現(xiàn):

func defaultHandleRecovery(c *Context, err any) {
	c.AbortWithStatus(http.StatusInternalServerError)
}

就是寫入了一個(gè)代表內(nèi)部服務(wù)器錯誤的狀態(tài)碼500,并結(jié)束了本次請求。

這里關(guān)鍵點(diǎn)是CustomRecoveryWithWriter的實(shí)現(xiàn),代碼很長,我們分段來看。如下:

主要分三部分:

將日志輸出到out中,這里是上述提到的DefaultErrorWriter,即os.Stderr。
defer延遲執(zhí)行部分。
c.Next()正常請求處理器部分。

這里需要注意的點(diǎn)就是:

recover函數(shù)需要再defer中調(diào)用。因?yàn)閐efer是在函數(shù)返回時(shí)才調(diào)用,所以當(dāng)發(fā)生panic時(shí)會導(dǎo)致函數(shù)返回,這樣才能捕獲panic。

作為中間件運(yùn)行,說明每次請求的處理器都被中間件包裝了,也就相當(dāng)于每個(gè)請求處理器都有這個(gè)defer函數(shù)。
在defer函數(shù)中,如果捕獲了panic,則將panic的詳細(xì)詳細(xì)記錄下來,可以發(fā)送到指定的輸出中,即函數(shù)中指定的out參數(shù)(默認(rèn)是os.Stderr),也可以指定其他的文件或Sentry等。

在gin中,正是該中間件的應(yīng)用,確保了web服務(wù)的健壯性。當(dāng)然,其他的web框架也有同樣的機(jī)制,實(shí)現(xiàn)原理也是一樣的。

以上就是Go gin框架處理panic的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Go gin框架處理panic的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言怎么使用變長參數(shù)函數(shù)

    Go語言怎么使用變長參數(shù)函數(shù)

    本文主要介紹了Go語言怎么使用變長參數(shù)函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 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語言實(shí)現(xiàn)遺傳算法的實(shí)例代碼

    Go語言實(shí)現(xiàn)遺傳算法的實(shí)例代碼

    Go 是一個(gè)開源的編程語言,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易。本文將重點(diǎn)介紹如何用Go語言實(shí)現(xiàn)遺傳算法。如果你還沒有參加過GoLang Tour,我還建議你快速看一下這門語言的介紹
    2017-11-11
  • Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的解決辦法

    Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的解決辦法

    這篇文章主要介紹了Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的的場景復(fù)現(xiàn)和解決辦法,文中通過代碼示例講解的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • Go開發(fā)環(huán)境搭建詳細(xì)介紹

    Go開發(fā)環(huán)境搭建詳細(xì)介紹

    由于目前網(wǎng)上Go的開發(fā)環(huán)境搭建文章很多,有些比較老舊,都是基于 GOPATH的,給新入門的同學(xué)造成困擾。以下為2023 版 Go 開發(fā)環(huán)境搭建,可參照此教程搭建Go開發(fā)環(huán)境,有需要的朋友可以參考閱讀
    2023-04-04
  • Go 如何基于IP限制HTTP訪問頻率的方法實(shí)現(xiàn)

    Go 如何基于IP限制HTTP訪問頻率的方法實(shí)現(xiàn)

    這篇文章主要介紹了Go 如何基于IP限制HTTP訪問頻率的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • golang1.21新特性全面講解

    golang1.21新特性全面講解

    經(jīng)過了半年左右的開發(fā),golang?1.21?最近正式發(fā)布了,這個(gè)版本中有不少重要的新特性和變更,尤其是在泛型相關(guān)的代碼上,下面小編就來和大家好好嘮嘮吧
    2023-08-08
  • golang?基于?mysql?簡單實(shí)現(xiàn)分布式讀寫鎖

    golang?基于?mysql?簡單實(shí)現(xiàn)分布式讀寫鎖

    這篇文章主要介紹了golang?基于mysql簡單實(shí)現(xiàn)分布式讀寫鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 用Go+WebSocket快速實(shí)現(xiàn)一個(gè)chat服務(wù)

    用Go+WebSocket快速實(shí)現(xiàn)一個(gè)chat服務(wù)

    這篇文章主要介紹了用Go+WebSocket快速實(shí)現(xiàn)一個(gè)chat服務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • golang敏感詞過濾的實(shí)現(xiàn)

    golang敏感詞過濾的實(shí)現(xiàn)

    本文主要介紹了golang敏感詞過濾的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論