异常处理概述
- 异常包括编译时异常和运行时异常,前者通过捕获异常而获取异常信息,后者主要通过规范代码开发,测试等手段减少运行时异常的发生
- 在开发中不管,dao层,service层,Controller层都有可能抛出异常
- 在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护
异常处理思路
- 系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理
- springmvc提供全局异常处理器(==一个系统只有一个异常处理器==)进行统一异常处理
springMvc自带的简单异常处理器
- springmvc中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了==HandlerExceptionResolver 接口==,全局异常处理器都需要实现该接口
- 使用这个异常处理首先需要在springmvc的配置文件中配置
<!-- springmvc提供的简单异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面 -->
<property name="defaultErrorView" value="/WEB-INF/jsp/error.jsp"/>
<!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception -->
<property name="exceptionAttribute" value="ex"/>
<!-- 定义需要特殊处理的异常,这是重要点 -->
<property name="exceptionMappings">
<props>
<!-- 可以定义多个特殊异常处理类 -->
<prop key="com.td.exception.UserException">/WEB-INF/jsp/error.jsp</prop>
<prop key="com.td.exception.CustomerException">/WEB-INF/jsp/error1.jsp</prop>
</props>
<!-- 还可以定义其他的自定义异常 -->
</property>
</bean>
- 根据上面的配置,有默认的处理页面,如果要满足我们的需求,需要自定义特殊的异常处理类
- 定义异常类型需要继承Exception
- 根据需要抛出异常
- ==总结==:使用上面的SimpleMappingExceptionResolver进行异常处理,具有继承简单,有良好的扩展性(可以自定义特殊异常处理类,异常显示页面),对已经写好的代码没有入侵性(比如:给 代码添加注解),但是这种方式仅仅能获取到异常信息,如果需要获取异常信息之外的是不可能的
自定义全局异常处理器
- 全局异常处理器处理思路:
- 解析出异常类型
- 如果是系统自定义的异常类型,直接取出异常信息,在错误页面显示
- 如果该异常类型不是系统自定义的异常,构造一个自定义的异常类型
- springmvc提供一个HandlerExceptionResolver接口,自定义全局异常处理器必须要实现这个接口
- 在springmvc的配置文件中,配置这个自定义的全局异常处理器
- 还是访问上面的Controller
- 结果:当抛出的是全局异常处理器中自定的异常的时候,会跳转到错误页面,携带错误的信息,如果不是那么重新构造了一个异常,还是跳转到同一个错误页面,但是错误信息是:未知错误,如果没有异常,正常往下执行。
- ==总结==:可以看出在自定义的异常处理器中能获取导致出现异常的对象,有利于提供更详细的异常处理信息,建议使用这种
@ExceptionHandler注解实现异常处理
- 增加BaseController类,并在类中使用@ExceptionHandler注解声明异常处理
- 所有需要异常处理的controller要继承BaseController,
- ==总结==:这种方式不需要在springmvc配置文件中配置,但是这种方式对代码有入侵性,需要继承BaseController,在异常处理的时候,不能获取除了异常以外的数据
未能捕获的异常的处理
- 对于一些没能捕获的异常,建议在web.xml中配置错误页面,放置没有捕获到的异常显示给客户
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>