gin框架defer+recover解决协程panic问题

gin框架中主程中的panic本身是会被gin拦截自动recover,并且会打印出非常详细的日志信息。

不过对于协程中的panic,gin并不能做到自动recover并打印日志信息,协程中遇到panic,会导致程序崩溃退出。

例如如下代码:

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/go-panic", func(ctx *gin.Context) {
        go func() {
            panic("panic")
        }()
    })
    r.Run()
}

运行该app之后,我们访问http://localhost/go-panic,会发现gin app退出了。

解决方案
对于协程,需要手动进行defer和recover,来避免app的退出,打印日志信息,比如上面的代码应该修改为:

package main

import (
    "fmt"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/go-panic", func(ctx *gin.Context) {
        go func() {
            defer func() {
                if err := recover(); err != nil {
                    fmt.Printf("error: %v\n", err)
                }
            }()
            panic("panic")
        }()
    })
    r.Run()
}

运行该app之后,我们访问http://localhost/go-panic,会发现gin app没有退出并且有打印错误日志。

出处:www.l1mn.com

原文标题:gin框架defer+recover解决协程panic问题

原文地址:https://www.l1mn.com/p/bdrrw3.html

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

评论

皖ICP备2023023451号

Copyright © L1MN.COM 联系方式:l1mnfw@163.com