当前位置: 首页 > news >正文

beego v2 处理全局异常

beego v2与v1有很大的变更,最近我在自己写一个小项目玩,由于不太会前端代码,所以选择使用beego框架,毕竟他有着支持web的小优势。当然,与前端后分离的没办法比,也与go-admin这类的不一样。但有个好处,就是可以自己随意定制前端界面。

但我在使用的时候,准备写一个全局异常捕获的时候,碰到问题了。通常这种情况,我第一个想到的是使用中间件。但我用网上搜了好几次,用AI也生成过,也看了下官方提供的例子,发现都没办法实现全局异常捕获。,v2版本与gin这类不一样,他没有Next函数(当然也可能是我没有找到),后面我跟踪了中间件的源代码,他是多次调用中件间,没办法直接在中间件上使用defer fun()进行全局异常捕获。

后面经过我多次跟踪查看,发现他配置文件BConfig有一个属性

    // RecoverFunc// @Description when Beego want to recover from panic, it will use this func as callback// see RecoverPanic// @Default defaultRecoverPanicRecoverFunc func(*context.Context, *Config)

但这个又比较坑,一个是没有对外开放的函数,一个是他直接使用了自己默认的处理

res.RecoverFunc = defaultRecoverPanic

我这个项目本来就是一个玩一玩的小项目,想做个全局异常捕获,但又不想写太多日志处理。后面我灵机一想,想到一个好办法。以下是我实现的代码,可以参考一下。

新增一个异常处理函数


var oldFunc func(*context.Context, *web.Config)func HandleRecover(cfg *web.Config) {oldFunc = cfg.RecoverFunccfg.RecoverFunc = RecoverFunc
}func RecoverFunc(ctx *context.Context, cfg *web.Config) {if err := recover(); err != nil {if e, ok := err.(bresp.PageError); ok {if e.Code != 200 {ctx.Output.SetStatus(e.Code)ctx.WriteString(e.Message)} else {ctx.Output.SetStatus(e.Code)ctx.JSONResp(bresp.RespMessage(e.Message))}return}if oldFunc != nil {oldFunc(ctx, cfg)}}
}

这个可以对我们自定义的异常进行解析,确保已知的错误,都能正常返回200,同时对非已知道的异常不需要做太多的日志处理,直接使用他默认的方法。

只要在main.go里使用以下代码,即可实现

middleware.HandleRecover(beego.BConfig)

这样一样,我们在逻辑处理时,只要判断有err时,就直接 panic(PageError{})即可

func Dangerous(v interface{}, code ...int) {if v == nil {return}c := 200if len(code) > 0 {c = code[0]}switch t := v.(type) {case string:if t != "" {panic(PageError{Code: c, Message: t})}case error:panic(PageError{Code: c, Message: t.Error()})}
}

这样,只要有返回err,我们就直接调用 Dangerous函数,即可,不需要一直if err != nil {}.

这样可以省掉很多错误判断和错误处理。

希望对大家有帮助~

另,如果有自己做日志处理的,或是想自己写异常日志的话,可以不需要使用oldFunc,自己去实现,可以参考自带的defaultRecoverPanic函数

http://www.dtcms.com/a/350147.html

相关文章:

  • 文献阅读笔记:KalmanNet-融合神经网络和卡尔曼滤波的部分已知动力学状态估计
  • Canvas 内凹弧形导航菜单(顶部内凹)
  • 基于MATLAB长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析等领域中的应用
  • 权限越权概念
  • centos7 安装coze
  • 【计算星座】2022-10-24
  • 普蓝超强承重越野移动机器人底盘轻松应对复杂路段
  • 《C++进阶:引用补充、内联函数与nullptr 核心用法》
  • 3 系统设计面试的框架
  • Odoo 企业版用户手册[新版]-前言 00.1-手册说明与使用指南
  • EasyClick 生成唯一设备码
  • SP95N65CTO:一款高性能650V SiC MOSFET的全面解析
  • 数据赋能(409)——大数据——合规性和伦理性原则
  • 强化学习基础总结
  • 《分布式系统跨服务数据一致性Bug深度复盘:从现象到本质的排查与破局》
  • 2025年优化算法:雪雁优化算法(Snow Geese Algorithm,SGA)
  • 2025 JVM 并发革命:虚拟线程与结构化并发,引领性能飞跃(35)
  • 京东前端社招面经
  • Pandas 高效数据处理:apply、向量化与分组
  • Qt——多媒体(音频、视频播放)
  • 艾利特石油管道巡检机器人:工业安全的智能守护者
  • 系统数据库
  • WRC2025 | 澳鹏亮相2025世界机器人大会,以数据之力赋能具身智能新纪元
  • 2025年9月计算机二级C++语言程序设计——选择题打卡Day6
  • 神经网络模型搭建及手写数字识别案例
  • 关于“程序=数据结构+算法”的深层认识
  • Java图形图像处理【双缓冲技术与游戏】【九】
  • Java全栈开发面试实战:从基础到微服务的深度解析
  • IDEA2022开启新版UI
  • 系统架构设计师备考第4天——计算机软件概述操作系统