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
随机推荐
- Redis基础详解
1. Redis是什么.特点.优势 Redis是一个开源的使用C语言编写.开源.支持网络.可基于内存亦可持久化的日志型.高性能的Key-Value数据库,并提供多种语言的API. 它通常被称为 数据结 ...
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 Banana
签到题 50的规模,随便搞搞都能过,用stl的string的搜索直接做了 #include <bits/stdc++.h> using namespace std; typedef lon ...
- 【vue 权威指南】 学习笔记 一
内容简介 vue.js 是一个用来开发Web界面的前端库. 1.vue.js 是什么 vue.js 是一个构建数据驱动的web界面的库,vue.js 通过简单的API提供高效的数据绑定和灵活的组件系统 ...
- asp.net web core 开发问题汇总(1)
1 ASP.NET Core 设置默认静态起始页 转载地址:ASP.NET Core 设置默认起始页(如default.html) 注:1 默认情况下ASP.NET Core应用程序时不支持静态 ...
- Day5 多线程 锁
synchronized保证操作原子性 这是因为对变量进行读取和写入时,结果要正确,必须保证是原子操作.原子操作是指不能被中断的一个或一系列操作. 通过加锁和解锁的操作,就能保证3条指令总是在一个线程 ...
- BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树
题意:给定一棵树,树上每个点有权值和类型.支持:修改某个点的类型:修改某个点的权值:询问某条链上某个类型的点的和/最大值.点数/类型数/询问数<=100000. 分析: 树链剖分,对每个类型的点 ...
- (转)预估大数据量下UV的方法
在实际应用中,我们经常碰到这种情况,即要统计某个对象或者事件独立出现的次数.对于较小的数据量,这很容易解决,我们可以首先在内存中对序列进行排序,然后扫描有序序列统计独立元素数目.其中排序时间复杂度为O ...
- 与大神聊天1h
与大神聊天1h 啊,与大神聊天1h真的是干货满满 解bug问题 之所以老出bug是因为我老是调用别人的包啊,在调参数的时候,并不知道内部机制 其实就自己写一个函数,然后能把功能实现就好了. 问题是,出 ...
- JMeter概念
1. Test Plan 测试计划 Test Plan也就是测试计划,概念有点类似eclipse里面的project(项目.工程). 一个JMeter测试计划有很多种测试元素组成.一般至少包含一个T ...
- 打表法fffff
打表法: 打表前先运行一下 看一看速度 优化: O3 #pragma GCC optimize(3,"Ofast","inline") O2 #pragma ...