一、本篇文章旨在讨论异常处理器:
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有其它异常处理方案,请不吝赐教。
本文完。