springmvc、 springboot 项目全局异常处理
异常在项目中那是不可避免的,通常情况下,我们需要对全局异常进行处理,下面介绍两种比较常用的情况。
准备工作:
在捕获到异常的时候,我们通常需要返回给前端错误码,错误信息等,所以我们需要手动封装一个jsonData对象,这里为了方便,我直接通过返回布尔类型来进行判断成功或失败,在实际的项目中更多是返回状态码 比如 0、1 、404 、500 等,在这里不影响我们演示。
jsondata对象

自定义一个异常 (注意需要继承RuntimeException,因为在spring中仅有RuntimeException支持事务)

情况一、对全局进行捕获,并统一返回json数据
我们通过@ControllerAdvice的方式来捕获全局异常
主要代码如下:
import com.me.exception.RbacException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice
@Slf4j
public class ExceptionHandReturnJson { private final String UNKNOW_EX_MSG = "未知错误"; @ExceptionHandler(Exception.class)
@ResponseBody
public JsonData handle(Exception e){
JsonData result = new JsonData();
/*判断异常的类型*/ // 如果是自定义异常
if(e instanceof RbacException){
log.error("【自定义异常】:{}"+e.getMessage());
result = JsonData.fail(e.getMessage());
}else{
log.error("【系统异常】:{}"+e.getMessage());
result = JsonData.fail(UNKNOW_EX_MSG);
}
return result;
}
}
然后确保我们这个类所在的包被扫描到即可。
下面我们自定义一个类,并手动产生一个异常:


运行结果:


情况二、对全局异常进行捕获,返回modelandview类型
我们通过实现HandlerExceptionResolver 的方式来捕获全局异常
主要代码如下:
package com.me.common; import com.me.exception.RbacException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map; /**
* 全局异常处理
*/ @Slf4j
public class ExceptionHand implements HandlerExceptionResolver { private final String UNKNOW_EX_MSG = "未知错误"; /**
* 通过实现HandlerExceptionResolver 接口,对捕获到的异常进行处理
* 当然,我们需要在spring容器中创建这个bean
* @param request
* @param response
* @param o
* @param e
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response,
Object o, Exception e) {
// 请求地址
// String url = request.getRequestURL().toString(); ModelAndView mav = new ModelAndView();
// 如果是自定义异常
if(e instanceof RbacException){
log.error("【自定义异常】:{}"+e.getMessage());
JsonData result = JsonData.fail(e.getMessage());
mav.addObject("result",result);
}else{
log.error("【系统异常】:{}"+e.getMessage());
JsonData result = JsonData.fail(UNKNOW_EX_MSG);
mav.addObject("result",result);
}
// 设置异常处理返回的页面,在/views/exception.jsp
mav.setViewName("exception");
return mav;
} }
然后我们需要在spring容器中创建这个类的bean , 按照springmvc和springboot不同的做法都可以。
同样,我们还是用刚才的方法进行测试


因为返回的是modelAndView类型的对象,所以我们需要创建一个view


运行结果:


===========================================================================================
总结:
上面就是两种种捕获全局异常进行处理的不同方式,
1.实现HandlerExceptionResolver接口,返回modelAndView类型
2.通过@ControllerAdvice注解捕获,并通过@ResponseBody返回json类型
具体使用哪种看实际的项目,个人更喜欢第一种,统一返回json类型。
其他:
更规范的json返回对象是code码而不是boolean类型的,这里只为了做演示。那么在我们使用code码的时候,我们抛异常的时候可以自定义传入code以及msg ,这时建议用枚举来管理二者关系,抛异常的时候传入枚举类型,捕获的时候再从枚举中取值。
更详细的课程教学,请看廖师兄的课程 https://www.imooc.com/learn/810
springmvc、 springboot 项目全局异常处理的更多相关文章
- Springboot项目统一异常处理
Springboot项目统一异常处理 一.接口返回值封装 1. 定义Result对象,作为通用返回结果封装 2. 定义CodeMsg对象,作为通用状态码和消息封装 二.定义全局异常类 三.定义异常处理 ...
- SpringMVC的处理器全局异常处理类
SpringMVC的处理器全局异常处理类 package com.huawei.utils; import org.springframework.web.servlet.HandlerExcepti ...
- springBoot注解大全JPA注解springMVC相关注解全局异常处理
https://www.cnblogs.com/tanwei81/p/6814022.html 一.注解(annotations)列表 @SpringBootApplication:包含了@Compo ...
- 全局捕获异常(适用于SpringMvc,SpringBoot项目)
@ControllerAdvice 是controller的一个辅助类,最常用的就是作为全局异常处理的切面类.约定了几种可行的返回值,可以返回String字符串,也可以返回ModelAndView,也 ...
- SpringBoot整合全局异常处理&SpringBoot整合定时任务Task&SpringBoot整合异步任务
============整合全局异常=========== 1.整合web访问的全局异常 如果不做全局异常处理直接访问如果报错,页面会报错500错误,对于界面的显示非常不友好,因此需要做处理. 全局异 ...
- 【springboot】全局异常处理
转自: https://blog.csdn.net/cp026la/article/details/86495196 前言: 开发中异常的处理必不可少,常用的就是 throw 和 try catch, ...
- springMVC学习(9)-全局异常处理
一.异常处理思路: 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的da ...
- Springboot项目全局异常统一处理
转自https://blog.csdn.net/hao_kkkkk/article/details/80538955 最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项 ...
- 【转载】springboot四 全局异常处理
http://tengj.top/2018/05/16/springboot13/ https://www.jb51.net/article/110533.htm
随机推荐
- JavaScript 删除某个数组中指定的对象和删除对象属性
Javascript: 删除指定对象:使用过程中只适合删除对象,如果数组中添加的是类型Function的话是删除不了的. function removeObjWithArr(_arr,_obj) { ...
- 关于IO板的输出(Do的写入)
IO板的输入输出遵循MODBUS协议 1.单个DO开关量寄存器写入-功能码05 例子-打开信道3 01 05 00 02 00 00 CD CA 01 从机地址(由io的配置文件决定) 05 功能码 ...
- Docker最全教程——从理论到实战(二十三)
如何节约云端成本? 上云在大部分情况下就是为了降低成本,在这方面,主流的容器服务基本上都能够有效地降低成本——不仅能够高效自动化的管理和控制容器,而且不需支付Kubernetes 主节点的费用.不过, ...
- 1307E - Cow and Treats 二分 枚举边界 容斥
1307E - Cow and Treats 题意 有一排给定口味的草,并且给m头牛,每个牛都只吃一种口味的草,并且要吃给定数量个.现在可以安排牛从两边出发,方向向另一方向进发,每次路过符合他口味的草 ...
- 【转】Java(多)线程中注入Spring的Bean
问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...
- [JSOI2010]快递服务
Description Luogu4046 BZOJ1820 Solution 暴力DP很好想,\(f[i][j][k][l]\)表示处理到第\(i\)个任务,三个人在\(i,j,k\)的方案数.显然 ...
- CodeForce 377 A mazes(dfs+连通性问题)
Pavel 喜欢网格迷宫.一个网格迷宫是一个 n × m 的长方形迷宫,其中每个单元格要么是空白的,要么是墙体.您可以从一个单元格走到另一个单元格,只要两个单元格均是空白的,且拥有一条公共的边. Pa ...
- R语言函数话学习笔记5
使用Tidyverse完成函数化编程 (参考了家翔学长的笔记) 1.magrittr包的使用 里面有很多的管道函数,,可以减少代码开发时间,提高代码可读性和维护性 1.1 四种pipeline 1.1 ...
- AcWing 1023. 买书 完全背包
//完全背包 求方案数目 //f[i][j] 只从前i个物品中选,且总体积恰好为j的方案的集合 //f[i][j]=f[i-1][j]+f[i-1][j-v*1]+f[i-1][j-v*2]+...f ...
- 一点点学习PS--实战七
本节实战的内容,熟练之前几个实战中的操作: 如反复使用图层调整层中曝光度,色彩平衡,调节图片的色调:反复使用图层样式中的颜色叠加--高斯模糊--添加图层蒙版--渐变工具--不透明度来画影子. 打组(C ...