Spring3.0中对异常的处理方法一共提供了两种:一种是使用HandlerExceptionResolver接口;一种是在Controller类内部使用@ExceptionHandler注解。使用第一种方式能够实现全局异常控制,而且Spring已经提供了一个默认的实现类SimpleMappingExceptionResolver;使用第二种方式能够在Controller内部实现更个性化点异常处理方式,灵活性更高。通常来讲,项目中只须要采用第一种方式就能够了,每一个人都本身定义异常的展示方式,太过个性了,不统一。html
从目前的调查结果看,这两种方式不能共存,不知道将来的版本是否能将他们合二为一,这样才能灵活配置。java
使用这种方式只须要实现resolveException方法,该方法返回一个ModelAndView对象,在方法内部对异常的类型进行判断,而后常见合适的ModelAndView对象,若是该方法返回了null,则Spring会继续寻找其余的实现了HandlerExceptionResolver 接口的Bean。换句话说,Spring会搜索全部注册在其环境中的实现了HandlerExceptionResolver接口的Bean,逐个执行,直到返回了一个ModelAndView对象。web
示例代码:spring
这个类必须声明到Spring中去,让Spring管理它,你可使用@Component标签,也可使用<bean/>节点。为了简单的进行异常处理,Spring提供了SimpleMappingExceptionResolver类,该类实现了HandlerExceptionResolver接口,须要使用时只须要使用<bean/>节点进行声明便可,示例以下:sql
一个典型的异常显示页面以下:
<html>
<head><title>Exception!</title></head>
<body>
<% Exception ex = (Exception)request.getAttribute("exception"); %>
<H2>Exception: <%= ex.getMessage();%></H2>
<P/>
<% ex.printStackTrace(new java.io.PrintWriter(out)); %>
</body>
</html>
exception 实在SimpleMappingExceptionResolver 被存放到request中的,具体能够查看源代码。
若是SimpleMappingExceptionResolver没法知足异常处理的须要,咱们能够针对
HandlerExceptionResolver接口实现本身异常处理类,这一样很是简单(只须要实现一个
resolveException方法)。
若是有ViewResolver,则制定的jsp页面必须在那个页面下,到时候若是找不到页面,能够根据错误提示再调整页面路径app
该方法须要定义在Controller内部,而后建立一个方法并用@ExceptionHandler注解来修饰用来处理异常,这个方法基本和 @RequestMapping修饰的方法差很少,只是能够多一个类型为Exception的参数,@ExceptionHandler中能够添加一个或多个异常的类型,若是为空的话则认为能够触发全部的异常类型错误。jsp
示例代码:ide