一、本篇文章旨在讨论异常处理器:

1、因为异常处理器在实战中通常用来处理开发人员自定义的运行时异常,所以如果要了解如何自定义运行时异常,请自行搜索相关资料。

2、本文的demo用IndexOutOfBoundsException来演示怎么处理希望处理的异常。(项目实战中,一般是一个开发人员自定义的异常)

二、进入主题:

我见到一些项目,通常在controller中加上try-catch模块,用来处理自定义异常和其它异常,并且打印日志。

此类try-catch代码就是样板代码:每个开发人员都要重复写一遍,既耗费时间,又容易在打印日志上犯一些错误。

是的,自定义异常处理器的一个目的,就是为了消除controller中的try-catch样板代码。它还有更多强大作用,例如参数处理。更多细节可以自行研究API。

本文将对自定义异常处理器做一个入门介绍。

三、代码:

spring中提供了两种不同的方案@ControllerAdvice和ExceptionResolver。

3.1 @ControllerAdvice

当任意一个Controller抛出一个IndexOutOfBoundsException异常时,会首先进入注册了@ControllerAdvice的处理器。

实现如下:

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import java.util.HashMap;
import java.util.Map; /**
* Created by baimq on 2017/5/1.
* spring3.2后支持该注解:ControllerAdvice
* 注册该bean,用以增强Controller的处理能力;
* 该bean中的注解ExceptionHandler用以增强Controller抛出的异常的处理能力。
*/
@ControllerAdvice
public class DemoEnhanceHandlerAdvice { //处理从任何一个Controller抛出的IndexOutOfBoundsException(自行指定处理何种异常)
@ExceptionHandler(IndexOutOfBoundsException.class)
public ModelAndView exception(Exception exception, WebRequest request) {
//Spring3.2是MappingJacksonJsonView,spring4是MappingJackson2JsonView
MappingJackson2JsonView jacksonJsonView = new MappingJackson2JsonView();
jacksonJsonView.setAttributesMap(createResultMap("901111", "越界错误"+exception.getMessage()));
return new ModelAndView(jacksonJsonView);//返回一个json
} protected Map<String, Object> createResultMap(String code, String message) {
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("code", code);
resultMap.put("message", message);
return resultMap;
} }

3.2 ExceptionResolver

如果未在ControllerAdvice注解中处理异常的话,IndexOutOfBoundsException会继续往上抛,在ExceptionResolver有另一次机会获得个性化的处理。

你可以继承org.springframework.web.servlet.HandlerExceptionResolver或者其它子类;

我选择使用了org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver作为demo。

**
* Created by baimq on 2017/5/1.
*/
@Component
public class DemoExceptionResolver extends AbstractHandlerExceptionResolver { @Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//Spring3.2是MappingJacksonJsonView,spring4是MappingJackson2JsonView
MappingJackson2JsonView jacksonJsonView = new MappingJackson2JsonView();
if(ex instanceof IndexOutOfBoundsException){
jacksonJsonView.setAttributesMap(createResultMap("901111", "越界错误:"+ex.getMessage()));
}else{
jacksonJsonView.setAttributesMap(createResultMap("901114", "未知错误:"+ex.getMessage()));
}
return new ModelAndView(jacksonJsonView);
} protected Map<String, Object> createResultMap(String code, String message) {
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("code", code);
resultMap.put("message", message);
return resultMap;
}
}

如spring有其它异常处理方案,请不吝赐教。

本文完。

												

spring异常处理器的更多相关文章

  1. spring设置全局异常处理器

    1.spring设置全局异常,它的原理是向上捕获 spring.xml配置 <!--自定义全局异常处理器--> <bean id="globalExceptionResol ...

  2. Spring Boot 中全局异常处理器

    Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloCon ...

  3. 【spring】-- springboot配置全局异常处理器

    一.为什么要使用全局异常处理器? 什么是全局异常处理器? 就是把错误异常统一处理的方法. 应用场景: 1.当你使用jsr303参数校验器,如果参数校验不通过会抛异常,而且无法使用try-catch语句 ...

  4. 012医疗项目-模块一:统一异常处理器的设计思路及其实现(涉及到了Springmvc的异常处理流程)

    我们上一篇文章是建立了一个自定义的异常类,来代替了原始的Exception类.在Serice层抛出异常,然后要在Action层捕获这个异常,这样的话在每个Action中都要有try{}catch{}代 ...

  5. spring 异常管理机制

    三.异常处理的几种实现: 3.1.在经典的三层架构模型中,通常都是这样来进行异常处理的: A.持久层一般抛出的是RuntiomeException类型的异常,一般不处理,直接向上抛出. B.业务层一般 ...

  6. 程序员笔记|常见的Spring异常分析及处理

    一.前言 相信我们每个人在SpringMVC开发中,都遇到这样的问题:当我们的代码正常运行时,返回的数据是我们预期格式,比如json或xml形式,但是一旦出现了异常(比如:NPE或者数组越界等等),返 ...

  7. 基于SpringMVC的全局异常处理器介绍(转)

    近几天又温习了一下SpringMVC的运行机制以及原理 我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)层,常用的注解有@Controller.@RequestM ...

  8. SpringMVC实现全局异常处理器 (转)

    出处:  SpringMVC实现全局异常处理器 我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手 ...

  9. 从源码看全局异常处理器@ExceptionHandler&@ExceptionHandler的生效原理

    1.开头在前 日常开发中,几乎我们的项目都会用到异常处理器,我们通常会定制属于自己的异常处理器,来处理项目中大大小小.各种各样的异常.配置异常处理器目前最常用的方式应该是使用@ControllerAd ...

随机推荐

  1. Eclipse实现图形化界面插件-vs4e

    vs4e插件下载地址:http://visualswing4eclipse.googlecode.com/files/vs4e_0.9.12.I20090527-2200.zip 下载完成后,解压,然 ...

  2. 【stm32中断优先级--珍藏版】

    看了这么久,一直不理解中断优先级,还有中断嵌套.stm32提供了多种嵌套方式,搞的我真是头昏脑涨. 今天终于看到了一个通俗解释中断优先级的博客.算是理解了一点吧. 原文地址:http://blog.s ...

  3. 在ABP框架中使用MapTo容易犯的错误

    用自己的话说:MapTo其实就是两个实体间的数据转换.不用像以前那样p.name=p1.name 这样赋值,一旦实体的属性多到十几个以上的时候,这样赋值代码就显得有些臃肿了,如下面: Resource ...

  4. phpcms后台管理

    phpcms从网上下载就好了,记住这个要安装在Wamp中的www文件下 从网页输入网址进入后台控制 输入密码账号,即进入后台控制界面: 后台管理有自带的网页模板把他换成自己的模板: 修改站点:   把 ...

  5. bzoj4825 [Hnoi2017]单旋

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...

  6. System.map详解

    system.map内容格式为:线性地址类型符号 具体内容如下: 00100000 A phys_startup_32 c0100000 T startup_32 c0100000 A _text   ...

  7. 蓝桥杯-兰顿蚂蚁-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  8. JavaScript中变量、参数、函数之间的关系

    ------------------------------ 废话不多说,直接开始. 我们看一段代码(参考其他资料所得) <script type="text/javascript&q ...

  9. MySQL对innodb某一个表进行移动

    (步骤:建表, 禁用表空间,复制表空间,重用表空间)   mysql> desc test; +-------+-------------+------+-----+---------+---- ...

  10. hdu1420 Prepared for New Acmer 简单数学

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1420 简单数学题 第一次wa在可能和会出现取模后值为负数的情况. 只要会一个数论上的简单公式(a*b) ...