如何編寫健壯的程式

jackypeng發表於2003-06-17
以下緊為個人觀點,希望大家討論和完善,並設計較為好用的類庫


編寫健壯程式,首先正確的理解類庫,
考慮異常處理和輸入引數校驗,其次是跟蹤和改進。

概念
程式的執行就是系統狀態的變化過程, 任何一個方法的執行,物件和系統會進入下一個狀態。錯誤的發生可歸結為:
 引數錯誤
 狀態錯誤,方法執行的前提條件沒有得到滿足
這些處理,在公有的(public)方法或類和非公有的方法或類處理中是不一樣的,比如在私有的方法中,一般不用有用引數校驗,因為它的呼叫者通常是程式的編寫者自己。但輸入引數是否為空物件,可以在呼叫之前進行診斷,然後進行相應的處理 (或者不判斷但系統會引發執行時錯誤)。

引數校驗一般是指使用者輸入和應用程式的呼叫時的引數輸入校驗,前者應該為程式必須處理的可恢復的異常,後者通常導致程式的執行邏輯產生的執行時異常,如典型的陣列越界和空指標, 一般在程式的設計中有一般的處理方式,在java中丟擲IllegalArgumentException或進行錯誤翻譯到適當的抽象層次進行丟擲。

異常一般有三種級別:
 可恢復,被檢查的異常,這類是呼叫應用程式必須處理的,我們寫程式處理的多半為這種異常。
 執行時錯誤,絕大部分為不可恢復的異常。此種異常的丟擲時,通常呼叫的功能不能成功的執行,但不是嚴重的,應用程式不會崩潰。這類異常的處理就非常重要,它會影響你程式的失敗範圍。
 非常嚴重的錯誤,它可能會導致整個應用程式崩潰,在JAVA中通常丟擲為ERROR型別錯誤,通常的起因為資源枯竭,環境嚴重錯誤。

對於在應用程式的體系結構設計中,其傳播途徑和處理方式,大家要達成共識,
首先為要把異常和正常區分開來,一個丟擲太多異常的介面,只會使程式過度複雜,一些需要處理的異常也不能加重別人的負擔。其次對使用者的輸入校驗應該作為被檢查的異常來處理,它是使用者可能出現的一種情況,也是使用者輸入和輸出介面的一部分,這類處理丟擲的錯誤資訊集中儲存便於修改,並使用統一的介面進行讀取,並放在公共的包類大家一起使用。
比如在apache的java專案axis開發中Developer's Guide 建議大家如此使用
Handle Specific Exceptions in Inner Code
Catch All Exceptions in Outermost Flow of Control
Catching and Logging Exceptions

下表為JAVA中最常用的異常類:
Table 1。 Commonly Used Exceptions
Exception Occasion for Use
IllegalArgumentException 非法引數
IllegalStateException 物件非法狀態
NullPointerException 空值引數
IndexOutOfBoundsException 下標越界
UnsupportedOperationException 沒有實現的方法。

原則
以下為異常處理的基本原則:
1. Use exceptions only for exceptional conditions
只對異常情況使用異常處理,不要使用異常實現控制結構,對於經常發生的可預計事件不要採用異常
2. Use checked exceptions for recoverable conditions and run-time exceptions for programming errors
在可恢復的情況下丟擲異常,程式錯誤使用執行時異常
3. Avoid unnecessary use of checked exceptions
避免過多的不必要的被檢查的異常
4. Favor the use of standard exceptions
儘量使用標準異常
5. Throw exceptions appropriate to the abstraction
異常的丟擲有正常的抽象級別
6. Document all exceptions thrown by each method
使用文件記錄丟擲的異常,例如JAVA DOC @exception name des cription
7. Include failure-capture information in detail messages
包括錯誤的詳細資訊
8. Strive for vetbfailure atomicity
使失敗原子性,不要讓程式在不正確的狀態,比如出錯事務回滾
9. Don't ignore exceptions
不要忽視(不處理)異常

設計
設計的目標為統一和規範化錯誤處理的流程,設計統一的共用類,大家進行統一排程。為了達到以上目標使用如下的原則:
1 錯誤的詳細資訊統一儲存
2 使用者的輸入校驗,網頁只處理是否為空和去掉頭尾空格,客戶斷邏輯進行型別轉換,業務邏輯層進行校驗,然後查詢錯誤資訊,使它成為最終的詳細的錯誤資訊返回給使用者。
3異常的產生,呼叫者對非使用者輸入引數校驗和狀態錯誤產生的異常,使用第5和第7條規則
錯誤資訊表
4 當然跟蹤和診斷也是不可少的

相關文章