golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json
golang(gin)全局統(tǒng)一異常處理,并統(tǒng)一返回json
定義Recover中間件
package handler
import (
"awesomeProject/Result"
"github.com/gin-gonic/gin"
"log"
"net/http"
"runtime/debug"
)
func Recover(c *gin.Context) {
defer func() {
if r := recover(); r != nil {
//打印錯(cuò)誤堆棧信息
log.Printf("panic: %v\n", r)
debug.PrintStack()
//封裝通用json返回
//c.JSON(http.StatusOK, Result.Fail(errorToString(r)))
//Result.Fail不是本例的重點(diǎn),因此用下面代碼代替
c.JSON(http.StatusOK, gin.H{
"code": "1",
"msg": errorToString(r),
"data": nil,
})
//終止后續(xù)接口調(diào)用,不加的話recover到異常后,還會(huì)繼續(xù)執(zhí)行接口里后續(xù)代碼
c.Abort()
}
}()
//加載完 defer recover,繼續(xù)后續(xù)接口調(diào)用
c.Next()
}
// recover錯(cuò)誤,轉(zhuǎn)string
func errorToString(r interface{}) string {
switch v := r.(type) {
case error:
return v.Error()
default:
return r.(string)
}
}
使用Recover中間件
func main() {
router := gin.Default()
//注意 Recover 要盡量放在第一個(gè)被加載
//如不是的話,在recover前的中間件或路由,將不能被攔截到
//程序的原理是:
//1.請(qǐng)求進(jìn)來(lái),執(zhí)行recover
//2.程序異常,拋出panic
//3.panic被 recover捕獲,返回異常信息,并Abort,終止這次請(qǐng)求
router.Use(handler.Recover)
router.GET("/ping", func(c *gin.Context) {
// 無(wú)意拋出 panic
var slice = []int{1, 2, 3, 4, 5}
slice[6] = 6
})
router.Run(":8080") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
golang中異常處理問(wèn)題
程序在運(yùn)行過(guò)程中如果出現(xiàn)了問(wèn)題,可以通過(guò)拋出異常、捕獲異常來(lái)進(jìn)行異常的處理,在golang中,異常的接口為error:
type error interface {
Error() string
}因此,只要一個(gè)結(jié)構(gòu)體實(shí)現(xiàn)了Error() string方法,就是實(shí)現(xiàn)了error接口:
type MyError struct {
}
func (err *MyError)Error() string{
return "this is MyError"
}golang中可以通過(guò)panic來(lái)拋出異常,recover來(lái)捕獲異常。如果不處理異常,最終會(huì)是程序整個(gè)退出
另外**捕獲異常必須在defer中進(jìn)行捕獲,否則捕獲異常recover不起作用**
type MyError struct {
}
func (err *MyError)Error() string{
return "this is MyError"
}
func PanicError() {
fmt.Println("panic error")
panic(MyError{})
}
func main() {
defer func(){
if err := recover() ; err != nil {
fmt.Println("catch error ",err)
}
}()
PanicError()
}defer的機(jī)制,有點(diǎn)類似于java中的finall語(yǔ)句塊
go中多個(gè)defer語(yǔ)句與defer的順序相反執(zhí)行,可以理解是將defer放入到一個(gè)先進(jìn)后出的隊(duì)列中
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Golang 錯(cuò)誤捕獲Panic與Recover的使用
對(duì)于Go語(yǔ)言的錯(cuò)誤是通過(guò)返回值的方式,本文主要介紹了Golang 錯(cuò)誤捕獲Panic與Recover的使用,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
深入淺出Go:掌握基礎(chǔ)知識(shí)的關(guān)鍵要點(diǎn)
Go是一種開(kāi)源的編程語(yǔ)言,由Google開(kāi)發(fā),它具有簡(jiǎn)潔、高效、并發(fā)性強(qiáng)的特點(diǎn),適用于構(gòu)建可靠的、高性能的軟件系統(tǒng),本文將介紹Go的基礎(chǔ)知識(shí),需要的朋友可以參考下2023-10-10
golang?pprof監(jiān)控memory?block?mutex使用指南
這篇文章主要為大家介紹了golang?pprof監(jiān)控memory?block?mutex使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
如何使用騰訊云go sdk 查詢對(duì)象存儲(chǔ)中最新文件
這篇文章主要介紹了使用騰訊云go sdk 查詢對(duì)象存儲(chǔ)中最新文件,這包括如何創(chuàng)建COS客戶端,如何逐頁(yè)檢索對(duì)象列表,并如何對(duì)結(jié)果排序以找到最后更新的對(duì)象,我們還展示了如何優(yōu)化用戶體驗(yàn),通過(guò)實(shí)時(shí)進(jìn)度更新和檢索多個(gè)文件來(lái)改進(jìn)程序,需要的朋友可以參考下2024-03-03
go開(kāi)源Hugo站點(diǎn)渲染之模板詞法解析
這篇文章主要為大家介紹了go開(kāi)源Hugo站點(diǎn)渲染之模板詞法解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
go?defer延遲調(diào)用的使用場(chǎng)景示例詳解
這篇文章主要為大家介紹了go?defer延遲調(diào)用的使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Golang構(gòu)建WebSocket服務(wù)器和客戶端的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言構(gòu)建WebSocket服務(wù)器和客戶端,以實(shí)現(xiàn)雙向通信,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下2023-11-11

