Assert用于檢查不應該發生情況,用來幫助開發人員對問題的快速定位。異常處理用于對程序發生異常情況的處理,增強程序的健壯性、容錯性,減少程序使用中對用戶不有好的行為,不讓(通常也不必)用戶知道發生了什么錯誤。
實際開發中,我們通常將Assert與異常混淆,?不知道什么時候使用Assert,什么時候使用異常處理。或者不用Assert,將一切情況都歸為異常。這樣一來,就掩蓋了問題,當問題發生的時候,很難進行定位,而這些問題本該是在開發的時候就解決掉的。同時,也增加了開銷(在c#中,debug.Assert()編譯成release版本時,不會產生任何代碼,而try/catch在debug/release版本中都是有代碼產生,運行時需要開銷)。
考慮下面這個程序 :
代碼
?2???????Debug.Assert(container==null,?"container?argument?is?null");
?3?
?4???????XmlDocument?xmlDoc?=?new?XmlDocument();
?5???????try?{
?6???????????xmlDoc.Load(xmlPath);
?7???????????//?TO?DO?:?parse?data?from?xml?to?contianer
?8???????}
?9???????catch?(FileNotFoundException)?{?
10???????????//?TO?DO?:handle?exception
11???????}
12???????catch?(XmlException)?{
13???????????//?TO?DO?:handle?exception
14???????}
15?}
?
? 我們需要在調用的時候,確保參數container不為null。如果發布成公共類庫,那么應該做異常處理,確保第三方錯誤調用的時候,知道問題在哪。
關于異常處理,?在編寫代碼的時候,應充分考慮各種具體異常,而不簡單的catch到Exception,寫出更健壯的代碼。
通常來說,能夠用Assert的地方,都可以用try/catch處理?。但這不是好習慣。或許你可能認為,程序release后,try/catch也就比Assert多出那么點開銷,對現代的機器而言微不足道,那的確很對。為什么不認真對待自己寫出來的代碼呢?