我愛oo,我愛java

          交流blog QQ:421057986 oofrank@donews

          Spring 中的異常悖論

          這個題目可能有些危言悚聽,使用Spring的同行不用害怕,只是因為工作中碰到一些問題,才偶然想到這個問題。

          首先要明確幾個問題:
          1、系統隔離原則:
              即系統間依賴應該是清晰的,不因為一個系統的故障影響其他系統,甚至整個系統。
          2、簡單應用習慣:
              普通程序員只會處理checked Exception,負責任的程序員會處理被調用的函數可能拋出的異常(根據源碼或javadoc)
           

          我們碰到一個情況:
          使用Spring的 init 特性初試化一個bean--一個使用Qutarz的調度程序。初試化過程中會拋出RuntimeException,從而造成Spring容器的整個初試化失敗。首先我們修改了程序,捕獲了所有異常,在編碼指南中加入了一句話:"所有使用Spring-init機制初試化的類必須在init中捕獲所有異常:Exception"。因為只有如此才能保證整個系統不會因為局部問題而完全癱瘓。

          我覺得這是Spring對異常處理的一個悖論:
          正方:底層異常都封裝成Runtime的,經過幾次包裝--->簡單應用習慣--->異常被拋出領域層(init場景下:由Spring處理)
          反方: 一個類的失敗可以造成整個系統的失敗---->Spring被RuntimeException宕掉---->不符合系統隔離原則


          當然充分的測試可能可以解決這個問題:但是要注意,測試只能證明系統有bug,不能證明系統沒有bug。

          解決方案:
          1、好的設計習慣:將應該隔離的系統隔離開-->使用不同的Spring配置文件.
          2、接口層錯誤處理:在接口層應該盡量對可以處理的異常進行處理,然后以合理的方式傳遞給上層.


          PS:在與人交互的系統中都應該給最終用戶合理的錯誤提示,所以表現層應該盡量捕獲非業務的RuntimeException給最終用戶更好的操作感受。

          posted on 2006-01-19 21:40 兼聽則明 閱讀(252) 評論(0)  編輯  收藏 所屬分類: java


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 克拉玛依市| 旬阳县| 米易县| 通化市| 乌兰察布市| 高陵县| 平乐县| 喀喇| 搜索| 阜阳市| 宾阳县| 乌鲁木齐县| 太谷县| 东宁县| 北安市| 永济市| 舟曲县| 册亨县| 建宁县| 云和县| 东光县| 伽师县| 鹿邑县| 台北市| 资中县| 寿阳县| 肥城市| 吉木乃县| 宜都市| 治多县| 蕲春县| 攀枝花市| 鹤岗市| 定陶县| 广宁县| 威信县| 嘉义县| 吐鲁番市| 徐水县| 兴安盟| 芜湖市|