风人园

弱水三千,只取一瓢,便能解渴;佛法无边,奉行一法,便能得益。
随笔 - 99, 文章 - 181, 评论 - 56, 引用 - 0
数据加载中……

Spring MVC异常处理(ZT)

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页面必须在那个页面下,到时候如果找不到页面,可以根据错误提示再调整页面路径

posted on 2008-04-07 08:15 风人园 阅读(13861) 评论(3)  编辑  收藏 所属分类: Spring

评论

# re: Spring MVC异常处理(ZT)  回复  更多评论   

写的不错,让我对springMVC的错误处理机制更进一步了
2011-05-02 19:52 | blur

# re: Spring MVC异常处理(ZT)  回复  更多评论   

我的Manager对象抛出一个RuntimeException给Spring的Controller层,SimpleMappingExceptionResolver 拦截到错误页面,但是Exception ex = (Exception)request.getAttribute("exception"); 获取不到对象,请问这是怎么回事?
2012-01-11 16:38 |

# re: Spring MVC异常处理(ZT)  回复  更多评论   

写得可以哦。
2012-03-09 19:15 | 红泪

只有注册用户登录后才能发表评论。


网站导航: