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

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. 数列分段Section II

    洛谷传送门 输入时处理出最小的答案和最大的答案,然后二分答案即可. 其余细节看代码 #include <iostream> #include <cstdio> using na ...

  2. Linux -atime、mtime、ctime

    Linux中,文件都有其自身的atime.mtime.ctime,在不同的命令下,各时间发生相应的改变.下面,我们来简单的介绍一下: atime (access time):表示最后一次访问文件或目录 ...

  3. 2017/4/27-Gradle的配置与Spring的下载

    Gradle的配置与Spring的下载 1.Gradle 1) 介绍 Gradle是一个基于Groovy的构建工具,类似Maven,但是比其更加简单轻便.它可以自动化地进行软件构建.测试.发布.部署. ...

  4. 初学Log4Net

    1.Log4Net是什么?       Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等)   2.Appender      Appende ...

  5. JTextArea自动换行以及设置滚动条

    应将JTextArea置于JScrollPanel中若要使只有垂直滚动条而没有水平滚动条,使用JTextArea.setLineWrap(true),自动换行. 文本换行代码片段如下: JTextAr ...

  6. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  7. 关于在"a"标签中添加点击事件的一些问题

    昨天做修改页面跳转时遇到一个问题,如果a标签的"href"属性为空的话,比如这样<a href="" onclick="roleupdate() ...

  8. kafka java使用

    首先添加maven依赖 Kafka <dependency> <groupId>org.apache.kafka</groupId> <artifactId& ...

  9. Linux 服务器 U盘安装(避免U盘启动)

    首先下载两个文件: ·         rhel-server-6.3-i386-boot.iso    启动镜像 ·         rhel-server-6.3-i386-dvd.iso     ...

  10. java.util.NoSuchElementException: None.get的解决方法

    在Java中用null表示无值返回.在Java 里,null 是一个关键字,不是一个对象,所以对它调用任何方法都是非法的 笔者就常在类型转换时见到空指针错误,便是由null的特殊性导致的 而在scal ...