首页 > 其他分享 >gin框架是如何处理panic

gin框架是如何处理panic

时间:2023-12-19 15:25:14浏览次数:21  
标签:框架 GET func test gin recover panic

保护gin构建的web app不panic的方式,简单来说:

1)主程中的panic本身是会被gin拦截的
2)协程中的panic需要手动使用defer和recover进行保护

情景
在用gin构建项目,运行web app并上线了之后,或许有一些请求会经过业务,在特定的情况下出发会触发golang中的panic

按照golang的设定,一旦panic,如果不在函数调用栈中存在recover,那么是一定会使得整个程序终止的

但是线上的服务是不能够因为一两个的请求就直接终止,这样非常危险,所以需要手段来阻止web app在panic的情况下直接终止

解决方案
1)主程序中的panic
对于gin这个web框架来说,主程序中的panic是会被自动recover,还会打印出非常详细的日志信息,比如

package main

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

func main() {
    r := gin.Default()
    r.GET("/test", func(ctx *gin.Context) {
        panic("test panic")
    })
    r.GET("/hello", func(ctx *gin.Context) {
        fmt.Println("test hello")
    })
    r.Run(":857")
}

原因是:在gin中,是通过使用该中间件来捕获panic,并保证服务不down机。 如果使用gin.Default()函数进行构建gin对象,那默认就注册了Recovery中间件。

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

2)协程中的panic
不过非常可惜的是,对于协程中的panic,gin并不能做到自动recover并打印日志信息,比如

package main

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

func main() {
    r := gin.Default()
    r.GET("/test", func(ctx *gin.Context) {
        go func() {
            panic("test panic")
        }()
    })
    r.GET("/hello", func(ctx *gin.Context) {
        fmt.Println("test hello")
    })
    r.Run(":857")
}

协程解决方案

recover函数能够捕获Panic错误并恢复程序的正常运行。

所以,对于协程,要手动进行deferrecover来避免app的退出和打印日志信息,比如上面的代码应该修改为

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

可以看到app正常响应了请求,并且没有退出并打印了日志,想要更多定制操作可以修改defer的函数。

标签:框架,GET,func,test,gin,recover,panic
From: https://www.cnblogs.com/beatle-go/p/17913805.html

相关文章

  • php mvc框架怎么实现路由的?
    都知道路由是实现框架重要的一步。如果对怎么实现框架感兴趣那必须要了解,而且对自己对正则表达是更加深刻了解。m----------模型v-----------视图c-----------控制器mvc模式就不想多说,网上解释的一大堆,各种理解。这个标准还是比较宽松的,看自己怎么理解。本文重点是是......
  • 企业数字化转型升级框架和全景图
            ......
  • windows本地部署webUI框架遇到的问题及解决
    最近对stablediffusion比较感兴趣,就想着拿一些模型在本地跑一跑感受一下,也想训练一些自己的模型玩一玩,刚开始参照网上的教程及github上的官方教程一直安装不成功,总是报错:torch安装不成功或其他的一些,本人系统是win10,总结了一些可以尝试的解决方法如下:1.对conda使用不是很熟悉,......
  • CF1905 B Begginer's Zelda 题解
    LinkCF1905BBegginer'sZeldaQuestion给出一棵树,每次能把一条路径压缩成一个点,求最少几次把树压缩成一个点Solution贪心的想,路径肯定越长越好,所以肯定是以一个儿子节点为起点,以一个儿子节点为终点,儿子节点合并了儿子到根的父节点也合并了,每次合并两个儿子节点,假设儿子节点......
  • centos升级nginx,增加fastdfs插件
    解决nginx漏洞,需要升级到指定1.22.1版本nginx缓冲区错误漏洞(CVE-2022-41741)nginx越界写入漏洞(CVE-2022-41742)https://mailman.nginx.org/pipermail/nginx-announce/2022/RBRRON6PYBJJM2XIAPQBFBVLR4Q6IHRA.html升级:首先到安装目录下cd/usr/local/nginx1、首先下载......
  • AtCoder Beginner Contest 324
    C-ErrorCorrection大意是:给定一个字符串a,以及一组字符串,如果字符串与a满足以下之一即可我写的有点麻烦。。#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn; cin>>n; strings; cin>>s; vector<int>ans; for(inti=1;i<=n;i++){ stringt; ci......
  • Keepalived+Nginx+Tomcat配置高可用负载均衡系统示例
    前言目前生产环境的配置越来越多的使用云服务了,同时负载均衡也基本转向了云厂商提供的服务,但对于绝大多数应用来说,自建集群可能在费用上要更便宜一些,这篇文章也是之前整理的,再次新瓶装旧酒分享给各位。此示例演示在不使用docker的情况下配置负载均衡,内容keepalived+nginx+tomcat......
  • 关于若依框架无法删除菜单
    问题如下:菜单需要停用才能删除一个个删掉子菜单后,删掉大菜单......
  • Nginx反向代理
    参考:https://mp.weixin.qq.com/s/2QVkA0ViNkO_i7fiZtIknQ反向代理是Nginx作为Web服务器最常用的功能之一。什么是反向代理呢?很多初学者在第一次遇到这个名词的时候总免不了出现很多问号。举个例子,小二的浏览器是无法直接访问谷哥的,但香港的代理服务器是可以访问谷哥的,于是小......
  • Nginx部署成服务,设置开机自启动
    一、centos7以上环境推荐centos环境,比较简单安装nginxyuminstallnginx允许nginx开机自启动systemctlenablenginx二、windows环境下载nginxhttps://nginx.org/en/download.html准备工具使用winsw.exe工具进行配置,以64位系统为例已上传到我的文件,可下载使......