posts - 70,comments - 408,trackbacks - 0

异常是当JVM(JAVA虚拟机)在执行应用程序的某个方法的时候遇到的非正常现象,JVM就会生成一个异常对象,抛给客户以便客户进行异常处理.Struts框架的异常处理机制建立在java异常处理的基础之上.在研究Struts异常处理之前,先回顾一下java异常处理原理,理解java虚拟机JVM的异常处理过程有助于应用设计正确的异常处理方法.处理异常需要JVM付出不小的开销,所以用于必须慎重使用.

JAVA异常是在java程序运行的时候遇到非正常的情况而创建的对象,它封装了异常信息,java异常的根类为java.lang.Throwable,整个类有两个直接子类java.lang.Error和java.lang.Exception.Error是程序本身无法恢复的严重错误.Exception则表示可以被程序捕获并处理的异常错误.JVM用方法调用栈来跟踪每个线程中一系列的方法调用过程,该栈保存了每个调用方法的本地信息.对于独立的JAVA程序,可以一直到该程序的main方法.当一个新方法被调用的时候,JVM把描述该方法的栈结构置入栈顶,位于栈顶的方法为正确执行的方法.当一个JAVA方法正常执行完毕,JVM回从调用栈中弹处该方法的栈结构,然后继续处理前一个方法.如果java方法在执行代码的过程中抛出异常,JVM必须找到能捕获异常的catch块代码.它首先查看当前方法是否贼这样的catch代码块,如果存在就执行该catch代码块,否则JVM回调用栈中弹处该方法的栈结构,继续到前一个方法中查找合适的catch代码块.最后如果JVM向上追到了main()方法,也就是一直把异常抛给了main()方法,仍然没有找到该异常处理的代码块,该线程就会异常终止,如果该线程是主线程,应用程序也随之终止,此时JVM将把异常直接抛给用户,在用户终端上会看到原始的异常信息.回顾完了JAVA的异常处理机制,就要开始研究Struts的异常处理了.

Struts框架在视图层和控制层提供了对异常处理的支持.Struts的控制器负责捕获各种异常,包括控制器运行中本身抛出的异常,以及调用模型的业务方法的异常.当异常被控制器捕获的时候,在异常处理代码块中,创建描述异常信息的ActionMessage对象把它保存在ActionMessages或者它的子类ActionErrors对象中,然后把它保存在特定的范围内,比如request或session.接下来在视图层<html:error>标签检索特定范围的ActionMessages对象,把本地化错误消息输出到页面上.这种异常处理机制可以避免用户看到原始的java异常信息.可以更友好的把错误信息展示给用户.

Struts框架处理异常是以JVM的异常处理机制为基础的,尽管它提供了强大的通用错误处理机制,但是不能保证捕获到所有的异常或者错误.当错误发生的时候,如果Struts不能处理这种异常或者错误,就把错误抛给JavaWeb容器.容器先查看是否在Web应用发布描述文件中配置了<error-page>元素,如果存在该元素就返回元素的子元素<location>指定的错误页面,否则就会把错误直接抛给用户.下面简单介绍一Struts几个重要的类的异常处理机制,如果想了解这几个类的更深的异常机制,建议查看Struts源代码.

1)              ActionServlet类的peocess()方法不捕获任何异常,仅仅声明向上层调用方法抛出异常.

2)              RequestProcessor类是Struts框架处理异常的核心组件.

3)              ExceptionHandler类是默认的异常处理类,它的execute()方法负责处理异常.

根据打造技术Blog,寻求JAVA精髓! Servlet规范,当容器捕获到异常的时候,将查看是否在Web.xml中配置了相

应的<error-page>元素,如果存在,就会返回其<location>子元素指定的错误页面.举个简单明了的例子如下:

<error-page>

  <error-code>500</error>

  <location>/error.jsp</location>

</error-page>

 

<error-page>

  <exception-type>javax.servlet.ServletException</error>

  <location>/error.jsp</location>

</error-page>

Struts框架也允许以配置的方式来处理异常,配置方法可以避免在Action类中通过硬编码来处理异常,提高应用的灵活性,可重用性和可维护性.对于Action类的execute()方法抛出的异常会先查找异常处理元素<exception>,如果是被嵌套在<global-exception>元素中就表示是全局异常处理元素,对所有的Action都适用.如果是嵌套在<action>元素中,就表示局部的异常处理元素,仅对当前的Action适用.阐述一下<exception>元素的属性:

1)     type:指定待处理的异常类

2)     handler:指定异常处理类.默认是ExceptionHandler.如果自己要定义必须继承它

3)     path:指定转发路径

4)     key:指定错误消息key.根据这个key到ResourceBundle中寻找匹配的消息文本

5)     bundle:指定ResourceBundle,如果没设置将使用哦么人的ResourceBundle

6)     scope:指定ActionMessages对象的存放范围,默认request,也可以设置session

Struts框架提供了强大的异常处理功能,Struts控制器负责捕获异常,并把异常包装与

ResourceBundle绑定的ActionMessages对象,在视图层<html:error>标签能够显示出来,主要可以通过配置的方式和编程的方式实现,这里不推荐用编程的方法,可以增强程序的灵活性,可重用性,可维护性. (网友们的支持,是我继续写技术文章的动力!)

posted on 2005-10-29 14:02 我心依旧 阅读(7658) 评论(10)  编辑  收藏

FeedBack:
# re: Struts异常处理(原创)
2005-10-30 11:51 | lunarychen
思路很清晰,条理很明了,可见功力不乏。很能静下心来学习的人。向你学习。  回复  更多评论
  
# re: Struts异常处理(原创)
2006-11-02 11:55 | zhang xiuqing
dd  回复  更多评论
  
# re: Struts异常处理(原创)
2006-11-16 14:32 | 梁帆
讲的很好,很生动.以后多来看你的文章.继续努力吧  回复  更多评论
  
# re: Struts异常处理(原创)
2006-11-28 15:14 | bbbb
只是OReilly Programming Jakarta Struts中的翻译罢了  回复  更多评论
  
# re: Struts异常处理(原创)
2007-03-28 09:52 | xx
这里不推荐用编程的方法,可以增强程序的灵活性,可重用性,可维护性. ???

到底是推荐,还是不推荐??  回复  更多评论
  
# re: Struts异常处理(原创)
2007-09-07 17:13 | 匿名
这个不是抄的孙卫勤的精通Struts中的嘛 ?
  回复  更多评论
  
# re: Struts异常处理(原创)
2007-10-03 19:14 | bluesea
举个例子会更好些!~  回复  更多评论
  
# re: Struts异常处理(原创)[未登录]
2008-11-26 21:58 | xxx
您在文章中提到,如果在struts中对exception不做处理,则会把错误直接抛给用户,不知道你指的抛给用户是怎样的抛呢?会做哪些处理?在web容器比如weblogic中会是一个什么样的反应?对weblogic服务会有什么样的影响,忘赐教,谢谢!  回复  更多评论
  
# re: Struts异常处理(原创)
2009-03-07 17:10 | hc
很明显Copy!还原创???
孙MM的文字。  回复  更多评论
  
# re: Struts异常处理(原创)
2009-07-01 08:25 | 匿名
孙卫琴写的比较详细,楼主总结的很好

无所谓抄袭,孙卫琴不也是参考OReilly Programming Jakarta Struts

翻译出来的吗?
  回复  更多评论
  

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


网站导航: