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
随机推荐
- Wannafly Winter Camp 2020 Day 5J Xor on Figures - 线性基,bitset
有一个\(2^k\cdot 2^k\) 的全零矩阵 \(M\),给出 \(2^k\cdot 2^k\) 的 \(01\) 矩阵 \(F\),现在可以将 \(F\) 的左上角置于 \(M\) 的任一位置 ...
- C#常规TcpListener
1.Xaml <Window x:Class="Server.MainWindow" xmlns="http://schemas.microsoft.com/win ...
- jQuery---自定义动画 animate();
自定义动画 animate(); 第一个参数:{对象},里面可以传需要动画的样式 第二个参数:speed 动画的执行时间 第三个参数:easing 动画的执行效果 第四个参数:callback 回调函 ...
- Robot Framework选择定位option类型下拉框
页面下拉框一般有两种类型,一种是div标签的,一种是option类型的,比如: div标签类型则可以通过定位进行元素点击去选择对应的枚举参数则可,而option类型的下拉选项则通过Selenium2L ...
- Linux的VMware虚拟机无法上网问题
很多时候,Linux无法上网,不管改成nat模式还是主机模式都不行.这时候可以选择进行重置: 首先点击编辑,之后点击虚拟网络编辑器, 然后移除VMnet0和VMnet8网络,点击确定: 然后再打开虚拟 ...
- [ZJOI2008] 生日聚会 - dp
共有\(n\)个男孩与\(m\)个女孩打算坐成一排.对于任意连续的一段,男孩与女孩的数目之差不超过 \(k\).求方案数. \(n,m \leq 150, k \leq 20\) Solution 设 ...
- Python中pip的使用
1.pip安装模块 pip install 模块名称 -i 安装源 pip install requests -i https://mirrors.aliyun.com/pypi/simple/
- Java判断一个字符串是否有中文
Java判断一个字符串是否有中文一般情况是利用Unicode编码(CJK统一汉字的编码区间:0x4e00–0x9fbb)的正则来做判断,但是其实这个区间来判断中文不是非常精确,因为有些中文的标点符号比 ...
- C++中多态实现的关键——虚函数
1.多态的作用 在面向对象程序设计中,使用多态能够增强代码的可扩充性,,即程序需要增加或修改部分功能时,只需修改少量代码就能够达到目的,此外多态也能起到精简代码的作用. 而实现多态的关键点,就是虚函数 ...
- vs2017+resharper之常用快捷键备忘
1.安装resharper后以vs2017的快捷键为主,让resharper作为一些方便的快捷键的补充. 2.vs2017的c++6的键盘布局模式快捷键 IntelliSence: 列表成员: Ctr ...