springMVC异常处理机制

无论做什么项目,进行异常处理都是非常有必要的,而且你不能把一些只有程序员才能看懂的错误代码抛给用户去看,所以这时候进行统一的异常处理,展现一个比较友好的错误页面就显得很有必要了。

Spring3.0对异常的处理通过HandlerExceptionResolver来实现。

HandlerExceptionResolver有4个实现类DefaultHandlerExceptionResolverAnnotationMethodExceptionResolverResponseStatusExceptionResolverSimpleMappingExceptionResolver。 

Spring3.0对异常的处理主要可通过这两种方式:

一种是使用HandlerExceptionResolver接口;

一种是在@Controller处理器内部使用@ExceptionHandler注解。

使用第一种方式可以实现全局异常控制,并且Spring已经提供了一个默认的实现类SimpleMappingExceptionResolver;

使用第二种方式可以在Controller内部实现更个性化异常处理方式。 

优先级

<!-- 使用@ExceptionHandler注解的方法来处理Exception,优先级为0(最高) -->
<bean name="exceptionHandlerExceptionResolver"
	 class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
 <property name="contentNegotiationManager" ref="mvcContentNegotiationManager" />
 <property name="messageConverters" ref="messageConverters" />
 <property name="order" value="0" />
</bean>

<!-- 如果抛出的Exception类带有@ResponseStatus注解,响应返回该注解的Http状态码,优先级为1 -->
<bean name="responseStatusExceptionResolver"
	 class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver">
 <property name="order" value="1" />
</bean>

<!-- SpringMvc内部异常处理 -->
<bean name="defaultExceptionResolver"
	 class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver">
 <property name="order" value="2" />
</bean>

DefaultHandlerExceptionResolver:

Springmvc默认装配了DefaultHandlerExceptionResolver,它会将springmvc的异常转换成对应的响应状态码(500,404等)

对于Unchecked Exception而言,由于代码不强制捕获,往往被忽略,如果运行期产生了Unchecked Exception,而代码中又没有进行相应的捕获和处理,则我们可能不得不面对尴尬的404、500……等服务器内部错误提示页面。  

我们需要一个全面而有效的异常处理机制。目前大多数服务器也都支持在web.xml中通过<error-page>(Websphere/Weblogic)或者<error-code>(Tomcat)节点配置特定异常情况的显示页面。

SimpleMappingExceptionResolver的使用

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<!-- 定义默认的异常处理页面 -->
	<property name="defaultErrorView" value="error"/>
	<!-- 定义异常处理页面用来获取异常信息的变量名,如果不添加exceptionAttribute属性,则默认为exception -->
	<property name="exceptionAttribute" value="exception"/>
	<!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页面名作为值 -->
	<property name="exceptionMappings">
		<props>
			<prop key="IOException">error/io.jsp</prop>
			<prop key="java.sql.SQLException">error/sql.jsp</prop>
		</props>
	</property>
</bean>

1、defaultErrorView, 当没有配置异常处理映射时,该默认视图将起作用

2、exceptionMappings 异常处理映射Property,key=“异常名称”, vlaue=异常处理视图

配置这个只能拦截Exception,404错误是拦截不了,要单独在web.xml配置,它比web.xml中配置错误页面强大的地方是可以把异常输出。

<error-page>
	<exception-type>java.lang.Exception</exception-type>
	<location>/jsp/error.jsp</location>
</error-page>
<error-page>
	<error-code>404</error-code>
	<location>/jsp/error.jsp</location>
</error-page>

猜你喜欢

转载自ezbcw.iteye.com/blog/2199335