异常在项目中那是不可避免的,通常情况下,我们需要对全局异常进行处理,下面介绍两种比较常用的情况。

准备工作:

在捕获到异常的时候,我们通常需要返回给前端错误码,错误信息等,所以我们需要手动封装一个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 项目全局异常处理的更多相关文章

  1. Springboot项目统一异常处理

    Springboot项目统一异常处理 一.接口返回值封装 1. 定义Result对象,作为通用返回结果封装 2. 定义CodeMsg对象,作为通用状态码和消息封装 二.定义全局异常类 三.定义异常处理 ...

  2. SpringMVC的处理器全局异常处理类

    SpringMVC的处理器全局异常处理类 package com.huawei.utils; import org.springframework.web.servlet.HandlerExcepti ...

  3. springBoot注解大全JPA注解springMVC相关注解全局异常处理

    https://www.cnblogs.com/tanwei81/p/6814022.html 一.注解(annotations)列表 @SpringBootApplication:包含了@Compo ...

  4. 全局捕获异常(适用于SpringMvc,SpringBoot项目)

    @ControllerAdvice 是controller的一个辅助类,最常用的就是作为全局异常处理的切面类.约定了几种可行的返回值,可以返回String字符串,也可以返回ModelAndView,也 ...

  5. SpringBoot整合全局异常处理&SpringBoot整合定时任务Task&SpringBoot整合异步任务

    ============整合全局异常=========== 1.整合web访问的全局异常 如果不做全局异常处理直接访问如果报错,页面会报错500错误,对于界面的显示非常不友好,因此需要做处理. 全局异 ...

  6. 【springboot】全局异常处理

    转自: https://blog.csdn.net/cp026la/article/details/86495196 前言: 开发中异常的处理必不可少,常用的就是 throw 和 try catch, ...

  7. springMVC学习(9)-全局异常处理

    一.异常处理思路: 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的da ...

  8. Springboot项目全局异常统一处理

    转自https://blog.csdn.net/hao_kkkkk/article/details/80538955 最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项 ...

  9. 【转载】springboot四 全局异常处理

    http://tengj.top/2018/05/16/springboot13/ https://www.jb51.net/article/110533.htm

随机推荐

  1. H5_0013:CSS特色样式集

    按比例变化,同时又限制最大宽高 ".start-wrap {", " width:40%;", " top: 83.21%;", " ...

  2. 数位dp(模板+例题)

    文章参考:数位dp之总结 首先,什么是数位dp?它是干什么的? 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数. 举个栗子: 加入我们要枚举所有上界不超过231 ...

  3. BZOJ 3438 小M的礼物

    BZOJ 3438 小M的礼物 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1. ...

  4. Python入门10 —— for循环

    1.字符串依次取值 students = ['egon', 'lxx', 'alex'] i = 0 while i < 3: print(students[i]) i += 1 2.针对循环取 ...

  5. Linux修复日志

    阿里云后台系统报告漏洞,解决记录 中级: RHSA-2019:0049-重要: systemd 安全更新

  6. normalization flow

    from Eric Jang Normalizing flows transform simple densities (like Gaussians) into rich complex distr ...

  7. VSCode C语言编程(一)环境搭建

    1.安装Visual Studio Code 2. 安装MinGW编译器 有两种方法 方法(1) 打开https://sourceforge.net/projects/mingw-w64/files/ ...

  8. 介绍axios和promise

    今天小编为大家带来 axios 和promise的详细讲解,包含 axios的使用方法 多种写法,封装 以及 promise的详细讲解,项目中如何运用等,会一一的为大家讲解清楚. 一.axios的介绍 ...

  9. ECMAScript基本语法——③数据类型

    Java内有两种 基本数据类型:4类八种 引用数据类型:对象 JavaScript也有两种 原始数据类型 其实是基本数据类型 number:数字.整数.小数.NaN(特殊的数字,not a numbe ...

  10. Jmeter-基础实战

    一.测试需求:测试20个用户访问web网站在负载达到30QPS时的平均响应时间 QPS:Query Per Second 每秒查询率.是一台查询服务器每秒能够处理的查询次数.在因特网上,作为域名系统服 ...