關於J2EE系統異常的處理準則
J2EE核心是一組技術規範與指南,其中所包含的各類組件、服務架構及技術層次,均有共同的標準及規格,讓各種依循J2EE架構的不同平臺之間,存在良好的兼容性。下面是小編整理的關於J2EE系統異常的處理準則,歡迎大家參考!
J2EE系統異常的處理準則
異常的處理是每個Java程序員時常面對的問題,但是很多人沒有原則,遇到異常也不知道如何去處理,於是遇到檢查異常就胡亂h...一把,然後tStackTrace()一下了事,這種做法通常除了調試排錯有點作用外,沒任何價值。對於運行時異常,則乾脆置之不理。
原因是很多開發者缺乏對異常的認識和分析,首先應該明白Java異常體系結構,一種分層繼承的關係,你必須對層次結構熟爛於心:
Throwable(必須檢查)
Error(非必須檢查)
Exception(必須檢查)
RuntimeException(非必須檢查)
一般把Exception異常及其直接子類(除了RuntimeException之外)的異常稱之爲檢查異常。把RuntimeException以及其子類的異常稱之爲非檢查異常,也叫運行時異常。
對於Throwable和Error,則用的很少,一般會用在一些基礎框架中,這裏不做討論。
下面針對J2EE的分層架構:DAO層、業務層、控制層、展示層的異常處理做個分析,並給出一般處理準則。
一、DAO層異常處理
如果你用了Spring的DAO模板來實現,則DAO層沒有檢查異常拋出,代碼非常的優雅。但是,如果你的DAO採用了原始的JDBC來寫,這時候,你不能不對異常做處理了,因爲難以避免的SQLException會如影隨形的`跟着你。對已這種DAO級別的異常,異常了你又能如何呢?與其這樣胡亂h...,囫圇吞棗消滅了異常不如讓異常以另外一種非檢查的方式向外傳遞。這樣做好處有二:
1)、DAO的接口不被異常所污染,假設你拋出了SQLException,以後要是換了Spring DAO模板,那DAO接口就不再拋出了SQLException,這樣,你的接口拋出異常就是對接口的污染。
2)、DAO異常向外傳播給更高層處理,以便異常的錯誤原因不丟失,便於排查錯誤或進行捕獲處理。
這裏還有一個設計上常常令人困擾的問題:很多人會問,那定義一個什麼樣的異常拋出呢,或者是直接拋出一個throw RuntimeException(e)? 對於這個問題,需要分場合,如果系統小,你可以直接拋出一個throw RuntimeException(e),但對於一個龐大的多模塊系統來說,不要拋這種原生的非檢查異常,而要拋出自定義的非檢查異常,這樣不但利於排錯,而且有利於系統異常的處理,通常針對每一個模塊,粗粒度的定義一個運行時DAO異常。比如:throw new ModelXxxDAORuntimeException(".....",e),對於msg信息,你可寫也可不寫,根據需要靈活拋出。
這裏常見一個很愚昧的處理方式,爲每個DAO定義一個異常,呵呵,這樣累不累啊,有多大意義,在Service層中調用時候,如果要捕獲,還要捕獲出一堆異常。這樣致命的問題是代碼混亂,維護困難,閱讀也困難,DAO的異常應該是粗粒度的。
二、業務層異常處理
習慣上把業務層稱之爲Service層或者服務層,Service層的代表的是業務邏輯,不要迷信分太多太多層有多大好處,除非需要,否則別盲目劃分不必要的層,層越多,效率越差,根據需要夠用就行了。
Service接口中的每個方法代表一個特定的業務,而這個業務一定是一個完整的業務,通常會看到一些傻X的做法,數據庫事務配置在Service層,而Service的實現就是DAO的直接調用,然後在控制層(Action)中,調用了好多Service去完成一個業務,你氣得已經無語了,低頭找磚頭去!!!
搞明白以上兩個問題後再回過頭看異常怎麼處理,Service層通常依賴DAO,而Service層的通常也會因爲調用別的非檢查異常方法而必須面對異常處理的問題,這裏和DAO層又有所不同,彼一時,此一時嘛!
一般來說一個小模塊對應一個Service,當然也許有兩個或多個,針對這個模塊的Service定義一個非檢查異常,以應付那些不可避免的異常檢查,這個自定義異常可以簡單的命名爲XxxServiceRuntimeException,將捕獲到的異常順勢轉譯爲非檢查異常後拋出。我喜歡這麼做,因爲前臺是J2EE應用,前臺是web頁面,它們的Struts2等框架會自動捕獲所有Service層的異常,並把異常交給開發者去自由處理。
但是還有一種情況,由於一些特殊的限制,如果某個異常一旦發生,必須做什麼什麼處理,而這種處理時硬性要求,或者調用某個Service方法,必須檢查處理什麼異常,也可以拋出非檢查的自定義異常,往往出現這種情況的是政治原因。不推崇這種做法,但也不排斥。
總之,對於接口,儘可能不去用異常污染她!
三、控制層異常
控制層說的簡單些就是常見的Action層,主要是控制頁面請求的處理。控制層通常都依賴於Service層,現在比較流行的框架對控制層做得都相當的到位,比如Struts2、SpringMVC等等,他們的控制層框架會捕獲業務層的所有異常,並在控制層中聲明可能拋出Exception,因此控制層一般不處理什麼異常。
如果是控制層中因爲調用了一些非檢查異常的方法,比如IO操作等,可以簡單處理下異常,保證流的安全,這纔是目的。
四、顯示層異常處理
對於頁面異常,處理的方式多種多樣,一是不處理異常,一旦異常了,頁面就報錯。二是定義出錯頁面,根據異常的類型以及所在的模塊,導航到出錯頁面。
一般來說,出錯頁面是更友好的做法。
另外還有特殊的處理方式,展示頁面的模板可以捕獲異常,並根據情況將異常信息鋪到相應的位置,這樣就更友好了,不過複雜度較高。
怎麼處理,就看需要了。
五、總結
1)、對於異常處理,應該從設計、需要、維護等多個角度綜合考慮,有一個通用準則:千萬別捕獲了異常什麼事情都不幹,這樣一旦出現異常了,你沒法依據異常信息來排錯。
2)、對於J2EE多層架構系統來說,儘可能避免(因拋出異常帶來的)接口污染。
相關文章
-
J2EE項目中的異常處理
如何在一個多層的j2ee項目中定義相應的異常類?在項目中的每一層如何進行異常處理?異常何時被拋出?異常何時被記錄?異常該怎麼記錄?何時需要把checked Exception轉化成unchecked Exception ,何時需要把unChecked Except -
j2ee和JSP的關係
J2EE是Java 2 Enterprise Eidtion,它們是Sun公司建立在Java語言上的一種服務器端的編程技術,簡單來說,它是用來動態生成網頁的一種技術,現在的主要對手是微軟主推的。 JSP和J2EE的關係簡述JSP應該是屬於J2EE的一部分,JS -
J2EE系統優化:對象與循環
優化一般意義上說是提高已有系統的性能,減少如內存、數據庫、網絡帶寬等資源的佔用,是在系統開發告一段落的前提下進行。一般是通過壓力測試或具體使用發現性能方面的問題,然後尋找性能瓶頸,並結合項目進度、人員安排、技 -
J2EE架構環境監控系統設計
下面是小編整理的從環境監控實際出發設計採用了基於J2EE開發平臺、B/S模式的環境監控系統設計方案。並進行了系統的數據結構設計、三層結構的系統設計以及系統功能設計的文章。 一、系統主要模塊本系統的功能爲能 -
Linux中生成Core Dump系統異常信息記錄文件處理方法介紹
前兩天,我家的小貓咪當上媽媽,生小寶寶了。我蹲在貓窩邊仔細看,看見兩隻黃色的小貓咪,還有兩隻小花貓。它們就像小老鼠那麼大,有的比老鼠還要小,全身溼淋淋的,毛都粘在一起,眼睛都沒睜開,樣子難看極了。他們擠成一團,貓媽媽疼愛 -
J2EE系統優化之對象與循環簡介
優化一般意義上說是提高已有系統的性能,減少如內存、數據庫、網絡帶寬等資源的佔用,是在系統開發告一段落的前提下進行。yjbys小編分享一篇J2EE系統優化之對象與循環給大家,希望大家認真閱讀!條例一:儘量重用對象,避免創建 -
SUN認證考試知識點:OSCache提升J2EE系統運行性能
我們偉大祖國素以禮儀之邦著稱於世,我們中華民族歷來十分注重文明禮貌,講文明從我做起。本站小編爲大家整理了文明禮儀從我做起演講稿3篇,歡迎大家閱讀。文明禮儀從我做起演講稿篇1古人說,不學禮,無以立。就是說,你不學禮,就 -
Web服務中的異常處理
太陽穴是我們人體非常重要的一個穴位,經常按摩太陽穴可以起到很好的養生保健功效,按摩太陽穴可以治療頭痛和眼睛疲勞,此外按摩太陽穴對於牙痛等症狀也有很好的緩解作用,所以我們在日常生活中不妨多按摩太陽穴。有些朋友可 -
安全監控系統異常情況處理制度
1、煤礦礦井安全監控系統值機人員發現瓦斯超限報警,必須立即通知礦調度室,礦值班領導負責組織隱患的.排查,並必須在6分鐘內將有關情況上報縣監控中心,傳真報告必須有礦值班領導簽字。同時要在處理過程中每半小時和警報消 -
常見的JavaWeb(J2EE)面試試題及答案
今年暑假,在南崑山夏令營,我第一次學做竹筒飯。開始先分組,我被分到第三組,有十幾個人。老師讓我們搬一根碗口粗細的毛竹,到河對岸的小亭去。我們把毛竹扛了起來,好重,竹子也髒,泥土都黏在上面。到了小亭,老師給每人發了一副手