golang(gin)的全局统一异常处理方式,并统一返回json

 更新时间:2024年01月16日 16:00:24   作者:刘海琼宝宝  
这篇文章主要介绍了golang(gin)的全局统一异常处理方式,并统一返回json,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

golang(gin)全局统一异常处理,并统一返回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 {
			//打印错误堆栈信息
			log.Printf("panic: %v\n", r)
			debug.PrintStack()
			//封装通用json返回
			//c.JSON(http.StatusOK, Result.Fail(errorToString(r)))
			//Result.Fail不是本例的重点,因此用下面代码代替
			c.JSON(http.StatusOK, gin.H{
				"code": "1",
				"msg":  errorToString(r),
				"data": nil,
			})
			//终止后续接口调用,不加的话recover到异常后,还会继续执行接口里后续代码
			c.Abort()
		}
	}()
	//加载完 defer recover,继续后续接口调用
	c.Next()
}

// recover错误,转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 要尽量放在第一个被加载
	//如不是的话,在recover前的中间件或路由,将不能被拦截到
	//程序的原理是:
	//1.请求进来,执行recover
	//2.程序异常,抛出panic
	//3.panic被 recover捕获,返回异常信息,并Abort,终止这次请求
	router.Use(handler.Recover)

	router.GET("/ping", func(c *gin.Context) {
		// 无意抛出 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中异常处理问题

程序在运行过程中如果出现了问题,可以通过抛出异常、捕获异常来进行异常的处理,在golang中,异常的接口为error:

type error interface {
    Error() string
}

因此,只要一个结构体实现了Error() string方法,就是实现了error接口:

type MyError struct {

}
func (err *MyError)Error() string{
    return "this is MyError"
}

golang中可以通过panic来抛出异常,recover来捕获异常。如果不处理异常,最终会是程序整个退出

另外**捕获异常必须在defer中进行捕获,否则捕获异常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的机制,有点类似于java中的finall语句块

go中多个defer语句与defer的顺序相反执行,可以理解是将defer放入到一个先进后出的队列中

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Golang 错误捕获Panic与Recover的使用

    Golang 错误捕获Panic与Recover的使用

    对于Go语言的错误是通过返回值的方式,本文主要介绍了Golang 错误捕获Panic与Recover的使用,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 深入浅出Go:掌握基础知识的关键要点

    深入浅出Go:掌握基础知识的关键要点

    Go是一种开源的编程语言,由Google开发,它具有简洁、高效、并发性强的特点,适用于构建可靠的、高性能的软件系统,本文将介绍Go的基础知识,需要的朋友可以参考下
    2023-10-10
  • golang pprof监控memory block mutex使用指南

    golang pprof监控memory block mutex使用指南

    这篇文章主要为大家介绍了golang pprof监控memory block mutex使用指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 如何使用腾讯云go sdk 查询对象存储中最新文件

    如何使用腾讯云go sdk 查询对象存储中最新文件

    这篇文章主要介绍了使用腾讯云go sdk 查询对象存储中最新文件,这包括如何创建COS客户端,如何逐页检索对象列表,并如何对结果排序以找到最后更新的对象,我们还展示了如何优化用户体验,通过实时进度更新和检索多个文件来改进程序,需要的朋友可以参考下
    2024-03-03
  • go开源Hugo站点渲染之模板词法解析

    go开源Hugo站点渲染之模板词法解析

    这篇文章主要为大家介绍了go开源Hugo站点渲染之模板词法解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 解读golang plugin热更新尝试

    解读golang plugin热更新尝试

    这篇文章主要介绍了解读golang plugin热更新尝试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Go语言通道之缓冲通道

    Go语言通道之缓冲通道

    这篇文章介绍了Go语言通道之缓冲通道,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go routine使用方法讲解

    Go routine使用方法讲解

    goroutine是Go语言提供的语言级别的轻量级线程,在我们需要使用并发时,我们只需要通过go关键字来开启goroutine即可。这篇文章主要介绍了GoLang并发机制goroutine原理,感兴趣的可以了解一下
    2023-01-01
  • go defer延迟调用的使用场景示例详解

    go defer延迟调用的使用场景示例详解

    这篇文章主要为大家介绍了go defer延迟调用的使用场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Golang构建WebSocket服务器和客户端的示例详解

    Golang构建WebSocket服务器和客户端的示例详解

    这篇文章主要为大家详细介绍了如何使用Go语言构建WebSocket服务器和客户端,以实现双向通信,文中的示例代码讲解详细,需要的小伙伴可以参考一下
    2023-11-11

最新评论