這段時間在準備.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]標識
多數情況下需要異常是可序列化的。當從另一個異常類繼承的時候,不要忘記增添這一屬性。
這裡也是借鑒了很多大牛的文章,自己感覺很受用,所以拿出來分享給大家。如果有什麼不足或者更好的見解,多多提出!