Go gin框架处理panic的方法详解

 更新时间:2023年09月28日 10:24:17   作者:林欣快滚去学习  
本文我们介绍下recover在gin框架中的应用, 首先,在golang中,如果在子协程中遇到了panic,那么主协程也会被终止,文中通过代码示例介绍的非常详细,需要的朋友可以参考下

本文我们介绍下recover在gin框架中的应用。 首先,在golang中,如果在子协程中遇到了panic,那么主协程也会被终止。如下:

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

panic被描述为不可处理的错误。在web服务中就是服务会崩溃。当然,这在生产环境下是不可接受的。那么,如何能够做到发生panic时技能捕获该panic又能让服务继续健康运行呢?

这就是golang中提供的recover函数了。recover函数能够捕获Panic错误并恢复程序的正常运行。

接下来,我们看下recover函数在gin框架中是如何应用的。

首先,要提到的就是gin框架中的recovery中间件。在gin中,是通过使用该中间件来捕获panic,并保证服务不down机的。 如果使用gin.Default()函数进行构建gin对象,那么默认就注册了Recovery中间件。

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

其次,我们来看下Recovery()中间件都做了些什么。

Recovery()函数定义如下:

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

这里的DefaultErrorWriter是默认的输出端,即os.Stderr。即指错误的输出到什么地方。

接下来看RecoveryWithWriter函数中的实现

// 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)
}

这里有一个参数是defaultHandleRecovery,我们看下它的实现:

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

就是写入了一个代表内部服务器错误的状态码500,并结束了本次请求。

这里关键点是CustomRecoveryWithWriter的实现,代码很长,我们分段来看。如下:

主要分三部分:

将日志输出到out中,这里是上述提到的DefaultErrorWriter,即os.Stderr。
defer延迟执行部分。
c.Next()正常请求处理器部分。

这里需要注意的点就是:

recover函数需要再defer中调用。因为defer是在函数返回时才调用,所以当发生panic时会导致函数返回,这样才能捕获panic。

作为中间件运行,说明每次请求的处理器都被中间件包装了,也就相当于每个请求处理器都有这个defer函数。
在defer函数中,如果捕获了panic,则将panic的详细详细记录下来,可以发送到指定的输出中,即函数中指定的out参数(默认是os.Stderr),也可以指定其他的文件或Sentry等。

在gin中,正是该中间件的应用,确保了web服务的健壮性。当然,其他的web框架也有同样的机制,实现原理也是一样的。

以上就是Go gin框架处理panic的方法详解的详细内容,更多关于Go gin框架处理panic的资料请关注脚本之家其它相关文章!

相关文章

  • golang包的引入机制详解

    golang包的引入机制详解

    本文深入探讨了Go语言中如何创建、组织和管理代码包,以及包引入的多种使用场景和最佳实践,通过阅读本文,希望能帮助大家获得全面而深入的理解,进一步提升Go开发的效率和质量
    2023-09-09
  • Golang实现数据结构Stack(堆栈)的示例详解

    Golang实现数据结构Stack(堆栈)的示例详解

    在计算机科学中,stack(栈)是一种基本的数据结构,它是一种线性结构,具有后进先出(Last In First Out)的特点。本文将通过Golang实现堆栈,需要的可以参考一下
    2023-04-04
  • golang实现简易的分布式系统方法

    golang实现简易的分布式系统方法

    这篇文章主要介绍了golang实现简易的分布式系统方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Go 1.22中的for循环新特性详解

    Go 1.22中的for循环新特性详解

    在 Go 语言中,for 循环是实现迭代的主要方式,Go 中的 for 循环非常灵活,有多种使用方式,本文将给大家详细的介绍一下Go 1.22中的for循环新特性,感兴趣的朋友可以参考下
    2024-02-02
  • Go语言编程中字符串切割方法小结

    Go语言编程中字符串切割方法小结

    这篇文章主要介绍了Go语言编程中字符串切割方法小结,所整理的方法都来自字符串相关的strings包,需要的朋友可以参考下
    2015-10-10
  • 分析Go语言中CSP并发模型与Goroutine的基本使用

    分析Go语言中CSP并发模型与Goroutine的基本使用

    我们都知道并发是提升资源利用率最基础的手段,尤其是当今大数据时代,流量对于一家互联网企业的重要性不言而喻。串流显然是不行的,尤其是对于web后端这种流量的直接载体。并发是一定的,问题在于怎么执行并发。常见的并发方式有三种,分别是多进程、多线程和协程
    2021-06-06
  • 基于Go goroutine实现一个简单的聊天服务

    基于Go goroutine实现一个简单的聊天服务

    对于聊天服务,想必大家都不会陌生,因为在我们的生活中经常会用到,本文我们用 Go 并发来实现一个聊天服务器,这个程序可以让一些用户通过服务器向其它所有用户广播文本消息,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • go cron定时任务的基本使用讲解

    go cron定时任务的基本使用讲解

    这篇文章主要为大家介绍了gocron定时任务的基本使用讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • go语法入门泛型type parameters简称T(类型形参)两种场景使用

    go语法入门泛型type parameters简称T(类型形参)两种场景使用

    这篇文章主要为大家介绍了go语法入门泛型type parameters简称T(类型形参)两种场景使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Go语法糖之‘...’ 的使用实例详解

    Go语法糖之‘...’ 的使用实例详解

    语法糖(Syntactic sugar),也译为糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。这篇文章主要给大家介绍Go语法糖之‘...’ 的使用,感兴趣的朋友一起看看吧
    2018-10-10

最新评论