springMVC系列(三)——异常统一处理

来源:互联网 发布:搜狗关键词优化排名 编辑:程序博客网 时间:2024/05/20 02:24

介绍

在开发中,常会出现各种各样的异常,我们不可能对每个异常都进行处理,那样工作量不仅大,而且不易改动,这就需要对异常进行统一处理,如给出错误提示、打印日志、跳转错误页面等。

SpringMVC处理异常的方式有

1.配置使用SpringMVC的简单异常映射解析器SimpleMappingExceptionResolver,它的作用是把异常解析映射成配置的页面

2.使用自定义的处理异常解析器,需要实现HandlerExceptionResolver。

3.使用@ExceptionHandler(异常处理器)注解实现异常处理

前两种对代码没有侵入型,第一种只是简单映射异常和页面,第二种可以对异常进行处理

实现

实现项目

Jar包


项目结构


自定义异常

ServiceException

public classServiceException extends RuntimeException {    private static final long serialVersionUID= 1L;    public ServiceException(Strings) {       super(s);    }}
ControllerException

public classControllerException extends RuntimeException {    private static final long serialVersionUID= 1L;    publicControllerException(String s) {       super(s);    }}
Controller

@Controller@RequestMapping("")public classTestController {       @Autowired(required=false)    private TestService testService;     @RequestMapping("exp")    public String exp(String id) throws Exception {       testService.thorwServiceException(id);       if("1".equals(id)) {           throw new ControllerException("controller exception");       }       return "exp";    }}
Service

@Servicepublic classTestService {    public voidthorwServiceException(String id) throwsException {       if("2".equals(id)) {           throw new ServiceException("service异常");       }    }}
exp.jsp

<%@ page language="java"contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title></title></head><body>    <p><a href="exp?id=1">controller抛异常</a></p>    <p><a href="exp?id=2">service抛异常</a></p></body></html>

使用简单异常映射解析器SimpleMappingExceptionResolver

在SpringMVC配置文件中加上

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">    <!-- 定义默认的异常处理页面,当该异常类型的注册时使用   -->   <property name="defaultErrorView" value="error"></property>    <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception  -->   <property name="exceptionAttribute" value="ex"></property>    <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值,会跳转到对应的异常页面 -->    <property name="exceptionMappings">         <props>             <prop key="com.lc.exception.ControllerException">error-contl</prop>             <prop key="com.lc.exception.ServiceException">error-service</prop>              <!-- 这里还可以继续扩展对不同异常类型的处理 -->         </props>    </property> </bean>

运行、效果



使用自定义异常处理解析器

新建EcpHandler类

public classEcpHandler implements HandlerExceptionResolver {    @Override    public ModelAndViewresolveException(HttpServletRequest request, HttpServletResponse response, Object handler,           Exceptionex) {       Map<String,Object> model= newHashMap<String, Object>();         model.put("ex", ex);        if(ControllerException.class.isInstance(ex)) {           return new ModelAndView("error-contl",model);       }elseif(ex instanceofServiceException) {             return new ModelAndView("error-service", model);         } else {             return null;         }    }}

在springMVC配置中注册

<bean id="excpHandler"class="com.lc.exception.EcpHandler"/> 
运行、效果



@ExceptionHandler这种方式不太常用,故不介绍

总结

使用简单异常映射解析器SimpleMappingExceptionResolver,优点集成是简单,方便、对代码没有入侵性,缺点是不能进行复杂的操作,如记录异常日志。

使用自定义异常处理解析器集成是简单,方便、对代码没有入侵性、也可以对异常进行自定义的处理操作。

 

参考资料

1.http://blog.csdn.net/ufo2910628/article/details/40399539

原创粉丝点击