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

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. jwt token Example - Python

    0 Pre Install Python3 Install PyCrypto Install PyJWT 1 token 由三部分组成 header, payload, sign 并用逗号连接各部分 ...

  2. aProxy: 带认证授权和权限控制的反向代理

    前段时间很多数据库因为没有做好权限控制暴露在外网被删然后遭勒索的事件,而类似的有些内网的web服务也会被开放到公网并且没有做任何权限控制的,这样也会有一定的风险.所以就决定写篇文章简单介绍一个小工具. ...

  3. angular 实现导航ng-click切换

    angular写的导航.自学angular已有一段时间. <!doctype html><html lang="en"><head> <m ...

  4. python库安装(numpy+scipy+matplotlib+scikit_learn)

    python安装好后,库安装走了很多弯路,查了很多资料,终于安装成功,并且保存了该文章的地址,分享给大家 本人电脑windows 7,64位系统,安装的Python是3.5的,因此下载的库也是对应版本 ...

  5. (知识点)JavaScript原型和原型链

    〇 每个函数都拥有prototype属性,而该属性所储存的就是原型对象 1)原型属性—— 上面我们测试了foo()函数的 1) length属性(length属性除了可以用在数组中,还可以用于记录函数 ...

  6. 微信公众号、H5、APP三者各有什么优势?

    昨天给大家分享了一个现在很热的H5,众所周知,当下H5手机网站.微信公众号.APP这三种载体都越来越火了,而且三者都有各自的一些优势和劣势. HTML5(H5) H5之所以能引发如此广泛的效应,根本在 ...

  7. JS基础——循环很重要

    介绍循环之前,首先要说一下同样很重要的if-else结构,switch-case结构 ①if-else结构 if(判断条件) { 条件为true时执行 } else{ 条件为false时执行 } ②i ...

  8. 我拖拖拖--H5拖放API基础篇

    不要搞错,本文不是讲如何拖地的.看过<javascript精粹>朋友应该知道,他实现拖放的过程比较复杂,现在时代不同了,我们用H5的新的拖放API就能非常方便的实现拖放效果了.最近在园子见 ...

  9. javascript原生方法实现extend

    var extend = (function () { for(var p in {toString:null}){ //检查当前浏览器是否支持forin循环去遍历出一个不可枚举的属性,比如toStr ...

  10. add,update,list.jsp源码

    add:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncod ...