項目中異常設計及處理總結

異常,爲我們處理非正常的業務流程提供了很好的解決方案,如果你有過dbase、c、pascal等過程式語言開發的經歷,你一定會深刻體會到,異常機制給你的代碼可讀行、可維護性帶來的好處,同時,程序的健壯性也得到了增強。
在 java項目中,異常設計要注意下面的幾點。
一、自定義異常父類的選擇
A、自定義異常的父類,可以選擇爲RuntimeException或Exception。RuntimeException是運行時異常,你可以選擇它 來做爲你的異常父類,因爲這種異常不受到編譯器檢查,因此,給予了程序員很大的靈活性,程序員可以處理這種異常,也可以不處理(實際上並不是不處理,而是 不立即處理,等到一個合適的地方再進行處理)。選擇RuntimeException作爲父類,是很多框架常採用的,如果你是做底層框架的,可以選擇 RuntimeException。
B、業務層異常,一般選擇Exception作爲父類,因爲業務層異常比較重要,一般都是要由調用者進行處理或者是要告知調用者會發生這種異常。如果你的 代碼是提供給第三方廠商用的,業務層封閉統一的異常就顯得非常的有必要。這類異常會強制要求程序員進行處理(異常轉譯或繼續聲明拋出),程序完整性、健壯 性得到了加強。
二、業務層自定義異常結構的設計
A、業務層自定義異常可以考慮按子系統來劃分,也就是說,每一個子系統(模塊)都有自己的異常定義,每個子系統自己維護自己的,統一向調用者拋出。
B、根據業務類型,從邏輯上劃分異常類型,比如:權限相關的,安全相關的,數據庫相關的等等。
總的來說,這兩種自定義異常也可以混合使用,因爲有的時候,子系統(業務模塊)本身就是從邏輯上進行劃分的。
三、異常結構定義
異常類的父類選定後,再定義自己的異常結構。一般的異常類中,要定義這麼一些東西。
A、描述字符串,說明異常的起因,或說明等。
B、異常碼。定義一個int或String類型的異常碼,異常碼在整個系統中統一定義,根據異常繼承結構,異常碼也可以定義得有層次結構。異常碼在大的系統中比較常見,Oracle ,Sqlserver等數據庫產品中,或華爲、中興的一些驅動api中。
C、定義一個Throwable的成員變量,用以封裝異常結構鏈。
D、定義無參數、有參數(String,Throwable)的構造方法。
四、在WEB三層模型中,異常的處理
在經典的三層架構模型中,通常都是這樣來進行異常處理的:
A、持久層一般拋出的是RuntiomeException類型的異常,一般不處理,直接向上拋出。
B、業務層一般要封裝自定義異常,統一向外拋出(這裏要注意,如果用spring在業務層管理異常,一定要配置好異常回滾類型,因爲spring默認只回 滾RuntiomeException類型的)。我也見過一些想省事的人,業務層也不定義任何異常,也不進行try catch,如果業務層出現異常將在表現層進行處理及頁面跳轉。
C、表現層必須要處理業務層的異常,以正確向客戶報告系統出現的問題,這裏面是最後一道異常處理的地方。我也見過有懶人在業務層都不處理,直接在web.xml中配置errorPage的,但不建議這麼做。
用好異常,對於項目的可維護性、健壯性都有極大的好處,當然,異常也不是萬能的,在有些項目中並不適用,比如:純算法項目,對性能要求極高的項目等,因爲 異常棧會對系統性能有一定開銷,在這些項目中,最後還在老老實實用方法的返回值去標識方法執行的結果,用if else去處理業務邏輯中的非正常情況吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章