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

Golang實現(xiàn)自定義recovery中間件

 更新時間:2023年09月06日 08:27:46   作者:路多辛  
在?Golang?的?Web?項目中,自定義?recovery?中間件是一種常見的做法,用于捕獲并處理應用程序的運行時錯誤,下面我們就來看看具體如何實現(xiàn)吧

為什么需要實現(xiàn)自定義 recovery 中間件

在 Golang 的 Web 項目中,自定義 recovery 中間件是一種常見的做法,用于捕獲并處理應用程序的運行時錯誤,以避免整個應用程序崩潰并返回對應格式的響應數(shù)據(jù)。

很多三方 web 框架(例如 gin、echo)都提供了官方實現(xiàn)的 recovery 中間件,但是官方實現(xiàn)的中間件并不一定能滿足自己的需求。例如 gin 官方提供的 recovery 中間件,發(fā)生 panic 后會將當前請求的標準狀態(tài)碼置為 500,body 置為空。但是這樣的返回數(shù)據(jù)與格式可能會和自己的項目要求不一致。例如,項目發(fā)生 panic 后是要求標準狀態(tài)碼依然返回 200,body 值為 {"code":-1, "data":nil,"msg":"xxx"},這種場景下,就需要實現(xiàn)自己的 recovery 中間件了。

如何實現(xiàn)自定義 recovery 中間件

如果使用 gin 框架的話,就非常簡單了,因為 gin 提供了完善的中間件功能,遵守 gin 的要求實現(xiàn)滿足自己項目的功能就可以了,簡單示例代碼如下:

package main
import (
    "github.com/gin-gonic/gin"
    "log"
    "net/http"
    "runtime"
)
func Recovery() gin.HandlerFunc {
    return func(c *gin.Context) {
        defer func() {
            if err := recover(); err != nil {
                const size = 64 << 10
                stack := make([]byte, size)
                stack = stack[:runtime.Stack(stack, false)]
                log.Printf("[GinPanic] %s\n", string(stack))
                c.JSON(http.StatusOK, struct {
                    Code int         `json:"code"`
                    Data interface{} `json:"data"`
                    Msg  string      `json:"msg"`
                }{
                    Code: -1,
                    Data: nil,
                    Msg:  "server panic",
                })
                c.Abort()
            }
        }()
        c.Next()
    }
}

使用示例如下:

package main
import (
    "github.com/gin-gonic/gin"
    "runtime"
)
func main() {
    r := gin.New()
    r.Use(Recovery())
    r.GET("/test", func(c *gin.Context) {
        panic("Oops! Something went wrong.")
    })
    r.Run(":8080")
}

運行起來后,訪問 /test 觸發(fā) panic 后返回了預期的結(jié)果,如下:

$ curl http://127.0.0.1:8080/test
{"code":-1,"data":null,"msg":"server panic"}

接下來再看一個基于原生包  net/http 的一個示例,代碼如下:

package main
import (
    "fmt"
    "log"
    "net/http"
    "runtime/debug"
)
// 自定義的recovery中間件
func recoveryMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if err := recover(); err != nil {
                // 打印錯誤信息
                log.Println("[Recovery] Panic:", err)
                // 打印堆棧跟蹤信息
                log.Printf("[Recovery] Stack Trace:\n%s\n", debug.Stack())
                // 返回一個適當?shù)腻e誤響應給客戶端
                fmt.Fprintf(w, `{"code":-1,"data":null,"msg":"server panic"}`)
            }
        }()
        // 繼續(xù)處理下一個中間件或路由處理函數(shù)
        next.ServeHTTP(w, r)
    })
}
// 示例的處理函數(shù)
func helloHandler(w http.ResponseWriter, r *http.Request) {
    panic("Oops! Something went wrong.") // 模擬一個錯誤
    w.Write([]byte("Hello, Recovery Middleware!"))
}
func main() {
    // 創(chuàng)建一個多路復用器
    mux := http.NewServeMux()
    // 注冊中間件
    mux.Handle("/test", recoveryMiddleware(http.HandlerFunc(helloHandler)))
    // 創(chuàng)建服務器
    server := &http.Server{
        Addr:    ":8080",
        Handler: mux,
    }
    // 啟動服務器
    log.Println("Server is running on http://localhost:8080")
    log.Fatal(server.ListenAndServe())
}

小結(jié)

Web 應用程序在運行時遇到錯誤并拋出 panic 時,自定義的 recovery 中間件將會捕獲panic 并記錄對應的錯誤和堆棧信息,避免應用程序崩潰,并向客戶端發(fā)送適當?shù)腻e誤響應數(shù)據(jù)。對于文本的示例,可以根據(jù)自己的實際需求進行調(diào)整和擴展來實現(xiàn)自定義的 recovery 中間件。

到此這篇關(guān)于Golang實現(xiàn)自定義recovery中間件的文章就介紹到這了,更多相關(guān)go recovery內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang Map value不可尋址使用指針類型代替示例詳解

    Golang Map value不可尋址使用指針類型代替示例詳解

    這篇文章主要為大家介紹了Golang Map value不可尋址使用指針類型代替示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Golang10進制轉(zhuǎn)16進制的幾種方法代碼示例

    Golang10進制轉(zhuǎn)16進制的幾種方法代碼示例

    這篇文章主要給大家介紹了關(guān)于Golang10進制轉(zhuǎn)16進制的幾種方法,進制轉(zhuǎn)換是Golang的一些基本操作,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Golang巧用defer進行錯誤處理的方法

    Golang巧用defer進行錯誤處理的方法

    錯誤處理是程序的重要組成部分,有效且優(yōu)雅的處理錯誤是大多數(shù)程序員的追求,下面這篇文章主要給大家介紹了關(guān)于Golang中巧用defer進行錯誤處理的方法,文中通過示例介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Go 計時器使用示例全面講解

    Go 計時器使用示例全面講解

    這篇文章主要為大家介紹了Go 計時器使用示例全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 深入了解Golang網(wǎng)絡編程Net包的使用

    深入了解Golang網(wǎng)絡編程Net包的使用

    net包主要是增加?context?控制,封裝了一些不同的連接類型以及DNS?查找等等,同時在有需要的地方引入?goroutine?提高處理效率。本文主要和大家分享下在Go中網(wǎng)絡編程的實現(xiàn),需要的可以參考一下
    2022-07-07
  • golang根據(jù)生日計算星座和屬相實例

    golang根據(jù)生日計算星座和屬相實例

    這篇文章主要為大家介紹了golang根據(jù)生日計算星座和屬相的示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go語言實現(xiàn)的一個簡單Web服務器

    Go語言實現(xiàn)的一個簡單Web服務器

    這篇文章主要介紹了Go語言實現(xiàn)的一個簡單Web服務器,本文先是給出一個使用http包建立的Web服務器源碼,并對比了其它編程語言,需要的朋友可以參考下
    2014-10-10
  • Go 代碼生成工具詳解

    Go 代碼生成工具詳解

    這篇文章主要介紹了Go 代碼生成工具詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Golang文件操作之讀取與寫入方法全攻略

    Golang文件操作之讀取與寫入方法全攻略

    本文詳細介紹了在Go語言中進行文件操作的方法,包括文件的創(chuàng)建、打開、讀取、寫入和關(guān)閉等,解析了使用os、bufio和io包進行高效文件操作的技巧,并提供了錯誤處理與性能優(yōu)化的建議,以幫助開發(fā)者有效管理文件資源并提升應用性能,需要的朋友可以參考下
    2024-11-11
  • GoFrame框架Scan類型轉(zhuǎn)換實例

    GoFrame框架Scan類型轉(zhuǎn)換實例

    這篇文章主要為大家介紹了GoFrame框架Scan類型轉(zhuǎn)換的實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論