<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Aaronlong31

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

     

     

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

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

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

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

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

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

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

    一、DAO層異常處理

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

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

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

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

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

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

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

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

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

    一般來說一個(gè)小模塊對應(yīng)一個(gè)Service,當(dāng)然也許有兩個(gè)或多個(gè),針對這個(gè)模塊的Service定義一個(gè)非檢查異常,以應(yīng)付那些不可避免的異 常檢查,這個(gè)自定義異??梢院唵蔚拿麨閄xxServiceRuntimeException,將捕獲到的異常順勢轉(zhuǎn)譯為非檢查異常后拋出。我喜歡這么 做,因?yàn)榍芭_(tái)是J2EE應(yīng)用,前臺(tái)是web頁面,它們的Struts2等框架會(huì)自動(dòng)捕獲所有Service層的異常,并把異常交給開發(fā)者去自由處理。

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

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

    三、控制層異常

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

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

    四、顯示層異常處理

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

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

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

    怎么處理,就看需要了。

    五、總結(jié)

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

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

    以上論述僅代表個(gè)人觀點(diǎn),歡迎交流。

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

     

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

    posted on 2010-01-25 11:09 Aaronlong31 閱讀(263) 評(píng)論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 精品日韩99亚洲的在线发布| 亚洲国产精品人久久| 亚洲欧美成人一区二区三区| 日本免费xxxx色视频| 亚洲国产成人久久精品影视| 久久久久国色av免费看| 久久久亚洲欧洲日产国码二区| 久久青草91免费观看| 亚洲成AV人网址| 日本一卡精品视频免费| 久久亚洲精品成人无码| 亚洲国产精品99久久久久久| 二级毛片免费观看全程| 国产成人精品免费视频动漫| 亚洲春色在线观看| 毛片免费视频观看| 亚洲色大成网站www久久九| 毛片免费观看的视频在线| 亚洲最大成人网色香蕉| 色窝窝免费一区二区三区| 亚洲无码一区二区三区| heyzo亚洲精品日韩| 国产一级一毛免费黄片| 亚洲av中文无码乱人伦在线咪咕 | 亚洲高清无码专区视频| 二级毛片免费观看全程| 亚洲AV无码久久| 成人免费在线观看网站| 久久精品国产亚洲AV未满十八| 免费日韩在线视频| 最近中文字幕大全免费视频| 91免费国产精品| 成人女人A级毛片免费软件| 亚洲高清中文字幕免费| 国产精品69白浆在线观看免费 | 亚洲精品在线电影| 国产无遮挡色视频免费视频| a级毛片无码免费真人久久| 99热亚洲色精品国产88| 亚洲日本在线观看视频| 6080午夜一级毛片免费看6080夜福利|