Aaronlong31

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            12 Posts :: 3 Stories :: 17 Comments :: 0 Trackbacks

          常用鏈接

          留言簿

          我參與的團(tuán)隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          #

           

           

          2EE系統(tǒng)異常的處理準(zhǔn)則

          異常的處理是每個Java程序員時常面對的問題,但是很多人沒有原則,遇到異常也不知道如何去處理,于是遇到檢查異常就胡亂 try...catch...一把,然后e.printStackTrace()一下了事,這種做法通常除了調(diào)試排錯有點作用外,沒任何價值。對于運行時異常,則干脆置之不理。

          原因是很多開發(fā)者缺乏對異常的認(rèn)識和分析,首先應(yīng)該明白Java異常體系結(jié)構(gòu),一種分層繼承的關(guān)系,你必須對層次結(jié)構(gòu)熟爛于心:

          Throwable(必須檢查)
                              Error
          (非必須檢查)
                              Exception
          (必須檢查)
                                              RuntimeException
          (非必須檢查)

          一般把Exception異常及其直接子類(除了RuntimeException之外)的異常稱之為檢查異常。把RuntimeException以及其子類的異常稱之為非檢查異常,也叫運行時異常。

          對于Throwable和Error,則用的很少,一般會用在一些基礎(chǔ)框架中,這里不做討論。

          下面針對J2EE的分層架構(gòu):DAO層、業(yè)務(wù)層、控制層、展示層的異常處理做個分析,并給出一般處理準(zhǔn)則。

          一、DAO層異常處理

          如果你用了Spring的DAO模板來實現(xiàn),則DAO層沒有檢查異常拋出,代碼非常的優(yōu)雅。但是,如果你的DAO采用了原始的JDBC來寫,這 時候,你不能不對異常做處理了,因為難以避免的SQLException會如影隨形的跟著你。對已這種DAO級別的異常,異常了你又能如何呢?與其這樣胡 亂try...catch...,囫圇吞棗消滅了異常不如讓異常以另外一種非檢查的方式向外傳遞。這樣做好處有二:

          1)、DAO的接口不被異常所污染,假設(shè)你拋出了SQLException,以后要是換了Spring DAO模板,那DAO接口就不再拋出了SQLException,這樣,你的接口拋出異常就是對接口的污染。

          2)、DAO異常向外傳播給更高層處理,以便異常的錯誤原因不丟失,便于排查錯誤或進(jìn)行捕獲處理。

          這里還有一個設(shè)計上常常令人困擾的問題:很多人會問,那定義一個什么樣的異常拋出呢,或者是直接拋出一個throw RuntimeException(e)? 對于這個問題,需要分場合,如果系統(tǒng)小,你可以直接拋出一個throw RuntimeException(e),但對于一個龐大的多模塊系統(tǒng)來說,不要拋這種原生的非檢查異常,而要拋出自定義的非檢查異常,這樣不但利于排 錯,而且有利于系統(tǒng)異常的處理,通常針對每一個模塊,粗粒度的定義一個運行時DAO異常。比如:throw new ModelXxxDAORuntimeException(".....",e),對于msg信息,你可寫也可不寫,根據(jù)需要靈活拋出。

          這里常見一個很愚昧的處理方式,為每個DAO定義一個異常,呵呵,這樣累不累啊,有多大意義,在Service層中調(diào)用時候,如果要捕獲,還要捕獲出一堆異常。這樣致命的問題是代碼混亂,維護(hù)困難,閱讀也困難,DAO的異常應(yīng)該是粗粒度的。

          二、業(yè)務(wù)層異常處理

          習(xí)慣上把業(yè)務(wù)層稱之為Service層或者服務(wù)層,Service層的代表的是業(yè)務(wù)邏輯,不要迷信分太多太多層有多大好處,除非需要,否則別盲目劃分不必要的層,層越多,效率越差,根據(jù)需要夠用就行了。

          Service接口中的每個方法代表一個特定的業(yè)務(wù),而這個業(yè)務(wù)一定是一個完整的業(yè)務(wù),通常會看到一些傻X的做法,數(shù)據(jù)庫事務(wù)配置在 Service層,而Service的實現(xiàn)就是DAO的直接調(diào)用,然后在控制層(Action)中,調(diào)用了好多Service去完成一個業(yè)務(wù),你氣得已經(jīng) 無語了,低頭找磚頭去!!!

          搞明白以上兩個問題后再回過頭看異常怎么處理,Service層通常依賴DAO,而Service層的通常也會因為調(diào)用別的非檢查異常方法而必須面對異常處理的問題,這里和DAO層又有所不同,彼一時,此一時嘛!

          一般來說一個小模塊對應(yīng)一個Service,當(dāng)然也許有兩個或多個,針對這個模塊的Service定義一個非檢查異常,以應(yīng)付那些不可避免的異 常檢查,這個自定義異常可以簡單的命名為XxxServiceRuntimeException,將捕獲到的異常順勢轉(zhuǎn)譯為非檢查異常后拋出。我喜歡這么 做,因為前臺是J2EE應(yīng)用,前臺是web頁面,它們的Struts2等框架會自動捕獲所有Service層的異常,并把異常交給開發(fā)者去自由處理。

          但是還有一種情況,由于一些特殊的限制,如果某個異常一旦發(fā)生,必須做什么什么處理,而這種處理時硬性要求,或者調(diào)用某個Service方法,必須檢查處理什么異常,也可以拋出非檢查的自定義異常,往往出現(xiàn)這種情況的是政治原因。不推崇這種做法,但也不排斥。

          總之,對于接口,盡可能不去用異常污染她!

          三、控制層異常

          控制層說的簡單些就是常見的Action層,主要是控制頁面請求的處理。控制層通常都依賴于Service層,現(xiàn)在比較流行的框架對控制層做得 都相當(dāng)?shù)牡轿唬热鏢truts2、SpringMVC等等,他們的控制層框架會捕獲業(yè)務(wù)層的所有異常,并在控制層中聲明可能拋出Exception,因此控制層一般不處理什么異常。

          如果是控制層中因為調(diào)用了一些非檢查異常的方法,比如IO操作等,可以簡單處理下異常,保證流的安全,這才是目的。

          四、顯示層異常處理

          對于頁面異常,處理的方式多種多樣,一是不處理異常,一旦異常了,頁面就報錯。二是定義出錯頁面,根據(jù)異常的類型以及所在的模塊,導(dǎo)航到出錯頁面。

          一般來說,出錯頁面是更友好的做法。

          另外還有特殊的處理方式,展示頁面的模板可以捕獲異常,并根據(jù)情況將異常信息鋪到相應(yīng)的位置,這樣就更友好了,不過復(fù)雜度較高。

          怎么處理,就看需要了。

          五、總結(jié)

          1)、對于異常處理,應(yīng)該從設(shè)計、需要、維護(hù)等多個角度綜合考慮,有一個通用準(zhǔn)則:千萬別捕獲了異常什么事情都不干,這樣一旦出現(xiàn)異常了,你沒法依據(jù)異常信息來排錯。

          2)、對于J2EE多層架構(gòu)系統(tǒng)來說,盡可能避免(因拋出異常帶來的)接口污染。

          以上論述僅代表個人觀點,歡迎交流。

          本文出自 “熔巖” 博客,請務(wù)必保留此出處http://lavasoft.blog.51cto.com/62575/244138

           

          版權(quán)聲明:原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章 原始出處 、作者信息和本聲明。否則將追究法律責(zé)任。http://lavasoft.blog.51cto.com/62575/244138

          posted @ 2010-01-25 11:09 Aaronlong31 閱讀(266) | 評論 (0)編輯 收藏

          http://www.verycd.com/topics/2793761/comments/page33/#comment7232788

          美國版

          上課鈴響了,孩子們跑進(jìn)教室,這節(jié)課老師要講的是《灰姑娘》的故事。
          老師先請一個孩子上臺給同學(xué)講一講這個故事。孩子很快講完了,老師對他表示了感謝,然后開始向全班提問。

          老師:你們喜歡故事里面的哪一個?不喜歡哪一個?為什么?
          學(xué)生:喜歡辛黛瑞拉(灰姑娘),還有王子,不喜歡她的后媽和后媽帶來的姐姐。辛黛瑞拉善良、可愛、漂亮。后媽和姐姐對辛黛瑞拉不好。
          老師:如果在午夜 12點的時候,辛黛瑞拉沒有來得及跳上她的番瓜馬車,你們想一想,可能會出現(xiàn)什么情況?
          學(xué)生:辛黛瑞拉會變成原來臟臟的樣子,穿著破舊的衣服。哎呀,那就慘啦。
          老師:所以,你們一定要做一個守時的人,不然就可能給自己帶來麻煩。另外,你們看,你們每個人平時都打扮得漂漂亮亮的,千萬不要突然邋里邋遢地出現(xiàn)在別人面前,不然你們的朋友要嚇著了。女

          孩子們,你們更要注意,將來你們長大和男孩子約會,要是你不注意,被你的男朋友看到你很難看的樣子,他們可能就嚇昏了(老師做昏倒?fàn)睿?/p>

          老師:好,下一個問題,如果你是辛黛瑞拉的后媽,你會不會阻止辛黛瑞拉去參加王子的舞會?你們一定要誠實喲!
          學(xué)生:(過了一會兒,有孩子舉手回答)是的,如果我辛黛瑞拉的后媽,我也會阻止她去參加王子的舞會。
          老師:為什么?
          學(xué)生:因為,因為我愛自己的女兒,我希望自己的女兒當(dāng)上王后。
          老師:是的,所以,我們看到的后媽好象都是不好的人,她們只是對別人不夠好,可是她們對自己的孩子卻很好,你們明白了嗎?她們不是壞人,只是她們還不能夠像愛自己的孩子一樣去愛其它的孩。
          -
          -老師:孩子們,下一個問題,辛黛瑞拉的后媽不讓她去參加王子的舞會,甚至把門鎖起來,她為什么能夠去,而且成為舞會上最美麗的姑娘呢?
          學(xué)生:因為有仙女幫助她,給她漂亮的衣服,還把番瓜變成馬車,把狗和老鼠變成仆人。
          老師:對,你們說得很好!想一想,如果辛黛瑞拉沒有得到仙女的幫助,她是不可能去參加舞會的,是不是?
          學(xué)生:是的!
          老師:如果狗、老鼠都不愿意幫助她,她可能在最后的時刻成功地跑回家嗎?
          學(xué)生:不會,那樣她就可以成功地嚇到王子了。(全班再次大笑)
          老師:雖然辛黛瑞拉有仙女幫助她,但是,光有仙女的幫助還不夠。所以,孩子們,無論走到哪里,我們都是需要朋友的。我們的朋友不一定是仙女,但是,我們需要他們,我也希望你們有很多很多的

          朋友。下面,請你們想一想,如果辛黛瑞拉因為后媽不愿意她參加舞會就放棄了機(jī)會,她可能成為王子的新娘嗎?
          學(xué)生:不會!那樣的話,她就不會到舞會上,不會被王子遇到,認(rèn)識和愛上她了。
          老師:對極了!如果辛黛瑞拉不想?yún)⒓游钑褪撬暮髬寷]有阻止,甚至支持她去,也是沒有用的,是誰決定她要去參加王子的舞會?
          學(xué)生:她自己。
          老師:所以,孩子們,就是辛黛瑞拉沒有媽媽愛她,她的后媽不愛她,這也不能夠讓她不愛自己。就是因為她愛自己,她才可能去尋找自己希望得到的東西。如果你們當(dāng)中 有人覺得沒有人愛,或者像辛

          黛瑞拉一樣有一個不愛她的后媽,你們要怎么樣?
          學(xué)生:要愛自己!
          老師:對,沒有一個人可以阻止你愛自己,如果你覺得別人不夠愛你,你要加倍地愛自己;如果別人沒有給你機(jī)會,你應(yīng)該加倍地給自己機(jī)會;如果你們真的愛自己,就會為自己找到自己需要的東西,

          沒有人可以阻止辛黛瑞拉參加王子的舞會,沒有人可以阻止辛黛瑞拉當(dāng)上王后,除了她自己。對不對?
          學(xué)生:是的!!!

          -老師:最后一個問題,這個故事有什么不合理的地方?
          學(xué)生:(過了好一會)午夜 12點以后所有的東西都要變回原樣,可是,辛黛瑞拉的水晶鞋沒有變回去。
          老師:天哪,你們太棒了!你們看,就是偉大的作家也有出錯的時候,所以,出錯不是什么可怕的事情。我擔(dān)保,如果你們當(dāng)中誰將來要當(dāng)作家,一定比這個作家更棒!你們相信嗎? 孩子們歡呼雀躍。
          此為美國一所普通小學(xué)的一堂閱讀課。我們是幾歲的時候才想到這些層面?
          ——小學(xué)老師教的,終身受用——

           

          中國版

          上課鈴響,學(xué)生,老師進(jìn)教室。
          老師:今天上課,我們講灰姑娘的故事。大家都預(yù)習(xí)了嗎?
          學(xué)生:這還要預(yù)習(xí)?老得掉渣了。
          老師:灰姑娘?是****童話還是安徒生童話?他的作者是誰?哪年出生?作者生平事跡如何?
          學(xué)生:......書上不都寫了嗎?不會自己看啊?
          老師:這故事的重大意義是什么?
          學(xué)生:得,這肯定要考的了。
          老師:好,開始講課文。誰先給分個段,并說明一下這么分段的理由。
          學(xué)生:前后各一段,中間一段,總分總.......
          老師:開始講課了,大家認(rèn)真聽講。
          學(xué)生:已經(jīng)開始好久了 .... ...........
          老師:說到這里,大家注意這句話。這句話是個比喻句,是明喻還是暗喻?作者為什么這么寫?
          學(xué)生: (n人開始睡覺 .... ........... )
          老師:大家注意這個詞,我如果換成另外一個詞,為什么不如作者的好?
          學(xué)生:(又 n人開始睡覺 .... ........... )
          老師:大家有沒有注意到,這段話如果和那段話位置換一換,行不行?為什么?
          學(xué)生:我又不是你,我怎么會注意到啊? (又 n人開始睡覺.... )
          老師:怎么這么多人睡覺啊?你們要知道,不好好上課就不能考好成績,不能考好成績就不能上大學(xué),不能上大學(xué)就不能......你們要明白這些做人的道理。
          PS:考上大學(xué),就開始人渣般的生活。

          posted @ 2010-01-20 13:14 Aaronlong31 閱讀(366) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共2頁: 上一頁 1 2 
          主站蜘蛛池模板: 白山市| 伽师县| 翁牛特旗| 韶关市| 达州市| 突泉县| 田林县| 昌黎县| 敦化市| 嘉黎县| 隆化县| 南宫市| 抚宁县| 石嘴山市| 凉城县| 山阴县| 宝坻区| 遵化市| 昌吉市| 屏山县| 封丘县| 交城县| 那曲县| 全南县| 达日县| 卢氏县| 赞皇县| 太康县| 前郭尔| 化州市| 正镶白旗| 江北区| 阜城县| 长丰县| 株洲县| 得荣县| 邛崃市| 疏勒县| 华亭县| 赞皇县| 体育|