您的位置:首页 > 编程语言 > Java开发

springMVc对异常的处理

2012-10-19 10:09 246 查看
Web应用中对于异常的处理方式与其他形式的应用并没有太大的不同――通过try/catch

语句针对不同的异常进行相应处理。

但是在具体实现中,由于异常层次、种类繁杂,我们往往很难在Servlet、JSP层妥善的处

理好所有异常情况,代码中大量的try/catch代码显得尤为凌乱。

我们通常面对下面两个主要问题:

1. 对异常实现集中式处理

典型情况:对数据库异常记录错误日志。一般处理方法无外两种,一是在各处数据库

访问代码的异常处理中,加上日志记录语句。二是将在数据访问代码中将异常向上抛

出,并在上层结构中进行集中的日志记录处理。

第一种处理方法失之繁琐、并且导致系统难以维护,假设后继需求为“对于数据库异

常,需记录日志,并发送通知消息告知系统管理员”。我们不得不对分散在系统中的各

处代码进行整改,工作量庞大。

第二种处理方法实现了统一的异常处理,但如果缺乏设计,往往使得上层异常处理过

于复杂。

这里,我们需要的是一个设计清晰、成熟可靠的集中式异常处理方案。

2. 对未捕获异常的处理

对于Unchecked Exception而言,由于代码不强制捕获,往往被程序员所忽略,如果

运行期产生了Unchecked Exception,而代码中又没有进行相应的捕获和处理,则我

们可能不得不面对尴尬的500服务器内部错误提示页面。

这里,我们需要一个全面而有效的异常处理机制。

上面这两个问题,从技术角度上而言并算不上什么大的难点。套用一些短平快的设计模式,

我们也能进行处理并获得不错的效果。同时,目前大多数服务器也都支持在Web.xml中通过

<error-page>(Websphere/Weblogic)或者<error-code>(Tomcat)节点配置特定异常情

况的显示页面。

Spring MVC中提供了一个通用的异常处理机制,它提供了一个成熟的,简洁清晰的异常处

理方案。如果基于Spring MVC开发Web应用,那么利用这套现成的机制进行异常处理也更加自

然和有效。

Spring MVC中的异常处理:

以前面的注册系统为例,首先,在Dispatcher配置文件Config.xml中增加id为

“exceptionResolver”的bean定义:

<bean id="exceptionResolver"

class="org.springframework.web.servlet.handler.SimpleMappingEx

ceptionResolver">

<property name="defaultErrorView">

<value>failure</value>

</property>

<property name="exceptionMappings">

<props>

<prop key="java.sql.SQLException">showDBError</prop>

<prop key="java.lang.RuntimeException">showError</prop>

</props>

</property>

</bean>

通过SimpleMappingExceptionResolver我们可以将不同的异常映射到不同的jsp页

面(通过exceptionMappings属性的配置),同时我们也可以为所有的异常指定一个默认的异

常提示页面(通过defaultErrorView属性的配置),如果所抛出的异常在exceptionMappings

中没有对应的映射,则Spring将用此默认配置显示异常信息(注意这里配置的异常显示界面均

仅包括主文件名,至于文件路径和后缀已经在viewResolver中指定)。

一个典型的异常显示页面如下:

<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页面必须在那个页面下,到时候如果找不到页面,可以根据错误提示再调整页面路径
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: