posts - 70,comments - 408,trackbacks - 0

          異常是當(dāng)JVM(JAVA虛擬機(jī))在執(zhí)行應(yīng)用程序的某個(gè)方法的時(shí)候遇到的非正?,F(xiàn)象,JVM就會(huì)生成一個(gè)異常對(duì)象,拋給客戶以便客戶進(jìn)行異常處理.Struts框架的異常處理機(jī)制建立在java異常處理的基礎(chǔ)之上.在研究Struts異常處理之前,先回顧一下java異常處理原理,理解java虛擬機(jī)JVM的異常處理過(guò)程有助于應(yīng)用設(shè)計(jì)正確的異常處理方法.處理異常需要JVM付出不小的開(kāi)銷(xiāo),所以用于必須慎重使用.

          JAVA異常是在java程序運(yùn)行的時(shí)候遇到非正常的情況而創(chuàng)建的對(duì)象,它封裝了異常信息,java異常的根類(lèi)為java.lang.Throwable,整個(gè)類(lèi)有兩個(gè)直接子類(lèi)java.lang.Error和java.lang.Exception.Error是程序本身無(wú)法恢復(fù)的嚴(yán)重錯(cuò)誤.Exception則表示可以被程序捕獲并處理的異常錯(cuò)誤.JVM用方法調(diào)用棧來(lái)跟蹤每個(gè)線程中一系列的方法調(diào)用過(guò)程,該棧保存了每個(gè)調(diào)用方法的本地信息.對(duì)于獨(dú)立的JAVA程序,可以一直到該程序的main方法.當(dāng)一個(gè)新方法被調(diào)用的時(shí)候,JVM把描述該方法的棧結(jié)構(gòu)置入棧頂,位于棧頂?shù)姆椒檎_執(zhí)行的方法.當(dāng)一個(gè)JAVA方法正常執(zhí)行完畢,JVM回從調(diào)用棧中彈處該方法的棧結(jié)構(gòu),然后繼續(xù)處理前一個(gè)方法.如果java方法在執(zhí)行代碼的過(guò)程中拋出異常,JVM必須找到能捕獲異常的catch塊代碼.它首先查看當(dāng)前方法是否賊這樣的catch代碼塊,如果存在就執(zhí)行該catch代碼塊,否則JVM回調(diào)用棧中彈處該方法的棧結(jié)構(gòu),繼續(xù)到前一個(gè)方法中查找合適的catch代碼塊.最后如果JVM向上追到了main()方法,也就是一直把異常拋給了main()方法,仍然沒(méi)有找到該異常處理的代碼塊,該線程就會(huì)異常終止,如果該線程是主線程,應(yīng)用程序也隨之終止,此時(shí)JVM將把異常直接拋給用戶,在用戶終端上會(huì)看到原始的異常信息.回顧完了JAVA的異常處理機(jī)制,就要開(kāi)始研究Struts的異常處理了.

          Struts框架在視圖層和控制層提供了對(duì)異常處理的支持.Struts的控制器負(fù)責(zé)捕獲各種異常,包括控制器運(yùn)行中本身拋出的異常,以及調(diào)用模型的業(yè)務(wù)方法的異常.當(dāng)異常被控制器捕獲的時(shí)候,在異常處理代碼塊中,創(chuàng)建描述異常信息的ActionMessage對(duì)象把它保存在ActionMessages或者它的子類(lèi)ActionErrors對(duì)象中,然后把它保存在特定的范圍內(nèi),比如request或session.接下來(lái)在視圖層<html:error>標(biāo)簽檢索特定范圍的ActionMessages對(duì)象,把本地化錯(cuò)誤消息輸出到頁(yè)面上.這種異常處理機(jī)制可以避免用戶看到原始的java異常信息.可以更友好的把錯(cuò)誤信息展示給用戶.

          Struts框架處理異常是以JVM的異常處理機(jī)制為基礎(chǔ)的,盡管它提供了強(qiáng)大的通用錯(cuò)誤處理機(jī)制,但是不能保證捕獲到所有的異?;蛘咤e(cuò)誤.當(dāng)錯(cuò)誤發(fā)生的時(shí)候,如果Struts不能處理這種異?;蛘咤e(cuò)誤,就把錯(cuò)誤拋給JavaWeb容器.容器先查看是否在Web應(yīng)用發(fā)布描述文件中配置了<error-page>元素,如果存在該元素就返回元素的子元素<location>指定的錯(cuò)誤頁(yè)面,否則就會(huì)把錯(cuò)誤直接拋給用戶.下面簡(jiǎn)單介紹一Struts幾個(gè)重要的類(lèi)的異常處理機(jī)制,如果想了解這幾個(gè)類(lèi)的更深的異常機(jī)制,建議查看Struts源代碼.

          1)              ActionServlet類(lèi)的peocess()方法不捕獲任何異常,僅僅聲明向上層調(diào)用方法拋出異常.

          2)              RequestProcessor類(lèi)是Struts框架處理異常的核心組件.

          3)              ExceptionHandler類(lèi)是默認(rèn)的異常處理類(lèi),它的execute()方法負(fù)責(zé)處理異常.

          根據(jù)打造技術(shù)Blog,尋求JAVA精髓! Servlet規(guī)范,當(dāng)容器捕獲到異常的時(shí)候,將查看是否在Web.xml中配置了相

          應(yīng)的<error-page>元素,如果存在,就會(huì)返回其<location>子元素指定的錯(cuò)誤頁(yè)面.舉個(gè)簡(jiǎn)單明了的例子如下:

          <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框架也允許以配置的方式來(lái)處理異常,配置方法可以避免在Action類(lèi)中通過(guò)硬編碼來(lái)處理異常,提高應(yīng)用的靈活性,可重用性和可維護(hù)性.對(duì)于Action類(lèi)的execute()方法拋出的異常會(huì)先查找異常處理元素<exception>,如果是被嵌套在<global-exception>元素中就表示是全局異常處理元素,對(duì)所有的Action都適用.如果是嵌套在<action>元素中,就表示局部的異常處理元素,僅對(duì)當(dāng)前的Action適用.闡述一下<exception>元素的屬性:

          1)     type:指定待處理的異常類(lèi)

          2)     handler:指定異常處理類(lèi).默認(rèn)是ExceptionHandler.如果自己要定義必須繼承它

          3)     path:指定轉(zhuǎn)發(fā)路徑

          4)     key:指定錯(cuò)誤消息key.根據(jù)這個(gè)key到ResourceBundle中尋找匹配的消息文本

          5)     bundle:指定ResourceBundle,如果沒(méi)設(shè)置將使用哦么人的ResourceBundle

          6)     scope:指定ActionMessages對(duì)象的存放范圍,默認(rèn)request,也可以設(shè)置session

          Struts框架提供了強(qiáng)大的異常處理功能,Struts控制器負(fù)責(zé)捕獲異常,并把異常包裝與

          ResourceBundle綁定的ActionMessages對(duì)象,在視圖層<html:error>標(biāo)簽?zāi)軌蝻@示出來(lái),主要可以通過(guò)配置的方式和編程的方式實(shí)現(xiàn),這里不推薦用編程的方法,可以增強(qiáng)程序的靈活性,可重用性,可維護(hù)性. (網(wǎng)友們的支持,是我繼續(xù)寫(xiě)技術(shù)文章的動(dòng)力!)

          posted on 2005-10-29 14:02 我心依舊 閱讀(7672) 評(píng)論(10)  編輯  收藏

          FeedBack:
          # re: Struts異常處理(原創(chuàng))
          2005-10-30 11:51 | lunarychen
          思路很清晰,條理很明了,可見(jiàn)功力不乏。很能靜下心來(lái)學(xué)習(xí)的人。向你學(xué)習(xí)。  回復(fù)  更多評(píng)論
            
          # re: Struts異常處理(原創(chuàng))
          2006-11-02 11:55 | zhang xiuqing
          # re: Struts異常處理(原創(chuàng))
          2006-11-16 14:32 | 梁帆
          講的很好,很生動(dòng).以后多來(lái)看你的文章.繼續(xù)努力吧  回復(fù)  更多評(píng)論
            
          # re: Struts異常處理(原創(chuàng))
          2006-11-28 15:14 | bbbb
          只是OReilly Programming Jakarta Struts中的翻譯罷了  回復(fù)  更多評(píng)論
            
          # re: Struts異常處理(原創(chuàng))
          2007-03-28 09:52 | xx
          這里不推薦用編程的方法,可以增強(qiáng)程序的靈活性,可重用性,可維護(hù)性. ???

          到底是推薦,還是不推薦??  回復(fù)  更多評(píng)論
            
          # re: Struts異常處理(原創(chuàng))
          2007-09-07 17:13 | 匿名
          這個(gè)不是抄的孫衛(wèi)勤的精通Struts中的嘛 ?
            回復(fù)  更多評(píng)論
            
          # re: Struts異常處理(原創(chuàng))
          2007-10-03 19:14 | bluesea
          舉個(gè)例子會(huì)更好些!~  回復(fù)  更多評(píng)論
            
          # re: Struts異常處理(原創(chuàng))[未登錄](méi)
          2008-11-26 21:58 | xxx
          您在文章中提到,如果在struts中對(duì)exception不做處理,則會(huì)把錯(cuò)誤直接拋給用戶,不知道你指的拋給用戶是怎樣的拋呢?會(huì)做哪些處理?在web容器比如weblogic中會(huì)是一個(gè)什么樣的反應(yīng)?對(duì)weblogic服務(wù)會(huì)有什么樣的影響,忘賜教,謝謝!  回復(fù)  更多評(píng)論
            
          # re: Struts異常處理(原創(chuàng))
          2009-03-07 17:10 | hc
          很明顯Copy!還原創(chuàng)???
          孫MM的文字。  回復(fù)  更多評(píng)論
            
          # re: Struts異常處理(原創(chuàng))
          2009-07-01 08:25 | 匿名
          孫衛(wèi)琴寫(xiě)的比較詳細(xì),樓主總結(jié)的很好

          無(wú)所謂抄襲,孫衛(wèi)琴不也是參考OReilly Programming Jakarta Struts

          翻譯出來(lái)的嗎?
            回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 昭平县| 德江县| 阿荣旗| 密山市| 乌兰察布市| 长海县| 沾化县| 太白县| 石河子市| 定边县| 花莲市| 灵璧县| 六枝特区| 渭源县| 溧水县| 建始县| 铜山县| 宜春市| 福泉市| 宁城县| 寿宁县| 昌图县| 贞丰县| 嘉兴市| 个旧市| 卫辉市| 盱眙县| 平罗县| 罗平县| 重庆市| 津市市| 东阳市| 昔阳县| 十堰市| 呼图壁县| 平潭县| 山丹县| 金坛市| 永嘉县| 伊宁县| 墨江|