赵走x博客
网站访问量:151840
首页
书籍
软件
工具
古诗词
搜索
登录
32、使用MyBatis注解实现数据库操作
31、MyBaties使用XML配置文件实现数据库操作
30、Spring Boot构建MyBatis应用程序
29、MyBatis简介
28、实战:实现JdbcTemplate多数据源
27、使用JdbcTemplate操作数据库
26、JdbcTemplate入门
25、实战:实现Web API版本控制
24、使用Swagger生成Web API文档
23、Thymeleaf页面布局
22、Thymeleaf内置对象、内嵌变量
21、Thymeleaf内联
20、Thymeleaf语法
19、Thymeleaf表达式
18、Thymeleaf入门
17、全局异常处理
16、实战:实现优雅的数据返回
15、跳转指定页面
14、Spring Boot静态资源
13、Spring Boot数据转换配置
12、跨域访问
11、Web配置
10、过滤器
9、拦截器
8、数据验证
7、参数传递
6、URL映射
5、@ResponseBody
4、@RequestMapping
3、@Controller和@RestController
2、Web项目结构
1、spring-boot-starter-web介绍
17、全局异常处理
资源编号:551787
热度:91
17、全局异常处理
在项目开发的过程中肯定会碰到异常的情况,出现异常情况时如何处理,如何确保出现异常时程序也能正确地返回数据? 总不能所有的方法都加上try catch吧? 接下来介绍Spring Boot如何进行全局异常处理,捕获异常后如何按照统一格式返回数据。 ### 1. 全局异常处理的实现方式 在介绍之前,我们需要先了解Spring中常见的异常处理方式有哪些。一般Spring Boot框架的异常处理有多种方式,从范围来说,包括全局异常捕获处理方式和局部异常捕获处理方式。下面介绍3种比较常用的异常处理解决方案。 (1)使用@ExceptionHandler处理局部异常 在控制器中通过加入@ExceptionHandler注解的方法来实现异常的处理。这种方式非常容易实现,但是只能处理使用@ExceptionHandler注解方法的控制器异常,而无法处理其他控制器的异常,所以不推荐使用。 (2)配置SimpleMappingExceptionResolver类来处理异常 通过配置SimpleMappingExceptionResolver类实现全局异常的处理,但是这种方式不能针对特定的异常进行特殊处理,所有的异常都按照统一的方式处理。 (3)使用ControllerAdvice注解处理全局异常 使用@ControllerAdvice、@ExceptionHandler注解实现全局异常处理,@ControllerAdvice定义全局异常处理类,@ExceptionHandler指定自定义错误处理方法拦截的异常类型。实现全局异常捕获,并针对特定的异常进行特殊处理。 以上三种解决方案,都能实现全局异常处理。但是,推荐使用@ControllerAdvice注解方式处理全局异常,这样可以针对不同的异常分开处理。 ### 2. 使用@ControllerAdvice注解实现全局异常处理 下面通过示例演示@ControllerAdvice注解实现全局统一异常处理。定义一个自定义的异常处理类GlobalExceptionHandler,具体示例代码如下: ``` @ControllerAdvice public class GlobalExceptionHandler { public static final String ERROR_VIEW = "error"; Logger logger = LoggerFactory.getLogger(getClass()); @ExceptionHandler(value = {Exception.class }) public Object errorHandler(HttpServletRequest reqest, HttpServletResponse response, Exception e) throws Exception { //e.printStackTrace(); // 记录日志 logger.error(ExceptionUtils.getMessage(e)); // 是否是Ajax请求 if (isAjax(reqest)) { return JSONResult.errorException(e.getMessage()); } else { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.addObject("url", reqest.getRequestURL()); mav.setViewName(ERROR_VIEW); return mav; } } /** * * @Title: GlobalExceptionHandler.java * @Package com.weiz.exception * @Description: 判断是否是Ajax请求 * Copyright: Copyright (c) 2017 * * @author weiz * @date 2017年12月3日 下午1:40:39 * @version V1.0 */ public static boolean isAjax(HttpServletRequest httpRequest){ return (httpRequest.getHeader("X-Requested-With") != null && "XMLHttpRequest" .equals( httpRequest.getHeader("X-Requested-With")) ); } } ``` 上面的示例,处理全部Exception的异常,如果需要处理其他异常,例如NullPointerException异常,则只需要在GlobalException类中使用@ExceptionHandler(value = {NullPointerException.class})注解重新定义一个异常处理的方法即可。启动项目,在浏览器中输入http://localhost:8088/err/error ,结果如图4-3所示。  如图4-3所示,处理异常之后页面自动调整到统一的错误页面,如果是Ajax请求出错,则会按照定义的JSON数据格式统一返回数据。