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

Go全局異常的實(shí)現(xiàn)示例

 更新時(shí)間:2025年08月08日 09:29:10   作者:Vespeng  
在Go項(xiàng)目開發(fā)中,有效的異常處理是確保程序健壯性和穩(wěn)定性的關(guān)鍵因素之一,全局異常處理機(jī)制能夠統(tǒng)一處理項(xiàng)目中可能出現(xiàn)的各種異常情況,下面就來介紹一下Go全局異常,感興趣的可以了解一下

在 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)

    本文主要介紹了Go并發(fā)編程實(shí)現(xiàn)數(shù)據(jù)競(jìng)爭(zhēng),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go語(yǔ)言操作Excel利器之excelize類庫(kù)詳解

    Go語(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-10
  • Golang TCP網(wǎng)絡(luò)編程的具體實(shí)現(xiàn)

    Golang 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-06
  • go語(yǔ)言數(shù)據(jù)類型之字符串string

    go語(yǔ)言數(shù)據(jù)類型之字符串string

    這篇文章介紹了go語(yǔ)言數(shù)據(jù)類型之字符串string,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Golang如何將日志以Json格式輸出到Kafka

    Golang如何將日志以Json格式輸出到Kafka

    這篇文章主要介紹了Golang將日志以Json格式輸出到Kafka的方法,這篇文章還會(huì)提供一種輸出Json格式日志的方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • golang?waitgroup的具體使用

    golang?waitgroup的具體使用

    本文主要介紹了golang?waitgroup的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Golang壓縮Jpeg圖片和PNG圖片的操作

    Golang壓縮Jpeg圖片和PNG圖片的操作

    這篇文章主要介紹了Golang壓縮Jpeg圖片和PNG圖片的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口的示例代碼

    golang 實(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-10
  • GO語(yǔ)言創(chuàng)建錢包并遍歷錢包(wallet)的實(shí)現(xiàn)代碼

    GO語(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
  • Go1.21新增slices包的用法詳解

    Go1.21新增slices包的用法詳解

    Go?1.21新增的?slices?包提供了很多和切片相關(guān)的函數(shù),可以用于任何類型的切片,這篇文章主要來和大家介紹一下slices包中相關(guān)函數(shù)的用法,需要的可以參考一下
    2023-08-08

最新評(píng)論