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
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
Copyright © L1MN.COM 联系方式:l1mnfw@163.com