.NET異常處理最佳實踐方案
關于.NET的異常處理,其實和JAVA是非常類似的,都是有了GC(垃圾回收器)。而在早期的VB/C/C++中貌似是沒有垃圾回收這個說法的,關于GC的各個好處大家都心知肚明了。那么,我們各位“猿”應該如何利用GC,更高效的編程呢?
說實話,這部分內容不太好整理,也不太好說明白。這些天反復整理這些內容,總覺得沒有抓住重點,花了非常大的功夫。后來想想,了解他的機制,倒不如多學學如何更好的利用它。
在此之前,先說一些基本的概念。
錯誤:程序中的錯誤一般分為三類:語法錯誤、邏輯錯誤、運行時錯誤。在異常處理中,錯誤主要說的是運行時錯誤,即已編譯好的程序在執行過程中出現的問題。
異常:由于錯誤的出現,運行時創建的用于處理錯誤的對象。
這里要強調的是:錯誤是指一個事件,而異常則是為了處理這個事件而創建的對象。
這里給出一些好的實踐方案,或者也可是說是異常處理原則。
1、及早檢查。
發現問題越早,這個問題就越容易解決
2、不要相信外部數據
所有的外部數據都應該被檢查(數據庫、文件、鍵盤等)
3、盡量不要拋出new Exception()
Exception是一個非常大的類,包含的信息量大
盡量使拋出的異常有針對性,能提供有意義的錯誤信息。
4、記錄異常
如果你捕獲一個異常,一定要在某處加以記錄,不要只記錄.message中的信息,要記錄所有的錯誤信息。
5、不要吞掉異常
你做的最糟糕的事情是在catch (Exception)后加了一個空的模塊。
6、經常使用Using
即使在有異常出現的地方,關鍵字using也會阻止資源泄漏。例如 using(SqlConnection conn = new SqlConnection())
{
//do something;
}
7、不要把異常處理方法作為從函數中返回信息的手段(不要用異常控制流程)
不僅異常的處理緩慢,而且代碼中許多的try/catch模塊會導致代碼很難維護。
8、為那些不該被忽略的錯誤使用異常
如果方法的執行有一定的要求或者前提,則應該使用異常,這樣調用程序就不能忽略它(例如,某些方法需要用戶信息)
9、當再次拋出異常時不要清空堆棧追蹤
Try {
}
catch(Exception ex)
{
//錯誤的方式
throw ex;
}
Try{
}
catch(Exception ex)
{
//正確的方式
throw ;
}
這里都是說捕獲到異常之后再次拋出,之所以說第一種情況是錯誤,是因為,第一種情況下,拋出的是新的異常,原來的異常信息被覆蓋掉了。而第二種情況會保留捕獲到的異常信息,在原來錯誤的基礎之上增加新的錯誤信息以拋出。
10、異常應該用[Serializable]標識
多數情況下需要異常是可序列化的。當從另一個異常類繼承的時候,不要忘記增添這一屬性。