如何編寫健壯的程式
以下緊為個人觀點,希望大家討論和完善,並設計較為好用的類庫
編寫健壯程式,首先正確的理解類庫,
考慮異常處理和輸入引數校驗,其次是跟蹤和改進。
概念
程式的執行就是系統狀態的變化過程, 任何一個方法的執行,物件和系統會進入下一個狀態。錯誤的發生可歸結為:
引數錯誤
狀態錯誤,方法執行的前提條件沒有得到滿足
這些處理,在公有的(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 當然跟蹤和診斷也是不可少的
編寫健壯程式,首先正確的理解類庫,
考慮異常處理和輸入引數校驗,其次是跟蹤和改進。
概念
程式的執行就是系統狀態的變化過程, 任何一個方法的執行,物件和系統會進入下一個狀態。錯誤的發生可歸結為:
引數錯誤
狀態錯誤,方法執行的前提條件沒有得到滿足
這些處理,在公有的(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 當然跟蹤和診斷也是不可少的
相關文章
- 寫出健壯的Bash指令碼指令碼
- setsockopt()改善程式的健壯性
- 如何提高nodejs程式的穩定性,健壯性NodeJS
- 論程式的健壯性——就看RedisRedis
- Python 系列:如何提高 python 程式程式碼的健壯性Python
- 如何讓程式更健壯「GitHub 熱點速覽」Github
- 健壯高效的小程式登入方案
- IM伺服器:編寫一個健壯的伺服器程式需要考慮哪些問題伺服器
- 基於SSL(TLS)的HTTPS網頁下載——如何編寫健壯的可靠的網頁下載TLSHTTP網頁
- 關於對健壯性程式碼的理解
- 論怎麼提高程式的健壯性
- 程式碼質量第 4 層 - 健壯的程式碼
- 讓你的C++程式碼變的更加健壯C++
- CodeReview--提高程式碼健壯性View
- 淺析:setsockopt()改善socket網路程式的健壯性
- 【程式碼修煉系列分享】改掉這些壞習慣,還怕寫不出健壯的程式碼?(二)
- 【程式碼修煉系列分享】改掉這些壞習慣,還怕寫不出健壯的程式碼?(一)
- 用Flow提升前端健壯性前端
- 如何設計一個優雅健壯的Android WebView?(上)AndroidWebView
- 如何設計一個優雅健壯的Android WebView?(下)AndroidWebView
- 程式碼安全性和健壯性:如何在if和assert中做選擇?
- 如何保障物聯網平臺的安全性與健壯性
- 如何自己實現一個健壯的 SSO 單點登入系統
- 從零開發一個健壯的npm包NPM
- 怎麼構建健壯的分散式系統?分散式
- 健壯且可讀的安卓架構設計安卓架構
- 健壯性測試工具-stress-ng
- 二人工作室如何為《力》打造健壯的角色建立工具
- MongoDB健壯叢集——用副本集做分片MongoDB
- 從部署架構提高系統健壯性架構
- 少壯不努力 老大寫程式碼
- 如何編寫簡潔的程式碼?
- 如何編寫MapReduce程式碼
- 【Java8新特性】Optional類在處理空值判斷場景的應用 迴避空指標異常 編寫健壯的應用程式Java指標
- 使用Go實現健壯的記憶體型快取Go記憶體快取
- 聊聊 Python 的應用 - 健壯高效的網路爬蟲Python爬蟲
- Data Guard 健壯性查詢必背彙總
- 如何編寫高效的Android程式碼Android