网站首页 > 精选教程 正文
定义中间件:
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)
}
}
使用中间件:
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")
}
猜你喜欢
- 2025-03-08 利用 setjmp和 longjmp实现异常处理机制的 C 语言技巧
- 2025-03-08 JVM频繁Full GC问题的排查与解决方案
- 2025-03-08 前端异常捕获与处理汇总,收藏篇
- 2025-03-08 京东大佬问我,Spring Boot 如何保证接口安全?请写出你的架构设计
- 2025-03-08 SpringBoot:如何优雅地进行响应数据封装、异常处理
- 2025-03-08 Springboot异常处理的五种方式,你会几种
- 2025-03-08 Java关于Exception和Error以及处理机制解析
- 2025-03-08 Spring Boot如何优雅实现结果统一封装和异常统一处理
- 2025-03-08 Spring MVC 中,优雅处理异常的 6种方式!
- 2025-03-08 学习Java异常,吃透这篇足够
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)