宗漢文 果金
隨著信息產業化的到來,越來越多的企業和個人參與到了軟件開發中來,隨著開發的不斷升級,控件的使用和美化程度也越來越高。但程序的愈發復雜多樣,隨之而來的是系統的效率和系統的容錯能力的下降,往往由于不重視系統容錯,不重視垃圾回收,會導致在項目中出現很多意想不到的問題,經常導致客戶體驗不好,系統意外崩潰的情況出現,可見軟件的容錯機制在系統中發揮著很重要的作用。
本人從事過很多項目的開發,曾經使用過VB語言,C++語言和C#語言,現如今C#語言的應用范圍現在越來越寬廣,但是其效率和對于跨平臺方面的硬傷也為人詬病。我本人在經歷的幾個C#項目中,總結了一些程序容錯方面的心得,故本文是針對C#語言的相關容錯機制進行簡要的論述和比較。希望讀者能在其中獲得自己想要的東西。
(1)C#容錯機制一:TRY-CATCH語句。
TRY-CATCH語句。確切的說是TRY-CATCH-FINALLY。不僅是在C#中,在JAVA,C++(最新版)中均有涉及,其語句的邏輯關系為:
Try
{
A;
}
Catch
{
B;
}
Finally
{
C;
}
熟悉C#語言的同學應該都知道,程序的執行順序應為先進入Try執行A,在執行A遇到錯誤時執行Catch內的B,最后執行Finally里的C。這就是C#代碼中比較基本的一個容錯機制。當循環執行某些程序時,可能會遇到由于數據的異常或者內存的溢出導致的問題,當不使用try-catch語句時,會導致系統的崩潰而退出,但是這不是我們想要的結果。所以在循環中使用try-catch后,系統將錯誤信息捕獲,但不影響下一條數據繼續執行,循環將繼續進行。在catch代碼中可以將錯誤發生的時間,發生的位置,發生的原因記錄下來,以為后期進行修改。而Finally中的代碼是永遠執行的。
當然TRY-CATCH也有缺點或者說是弱點,如果大量的使用,會造成系統的效率下降,速度變慢。大量的使用TRY-CATCH語句會使得程序占用大量的虛擬內存,所以適當的使用TRY-CATCH語句不僅會提升你的代碼容錯率,也會增加客戶好感度。
(2)C#容錯機制二:合理的軟件事務。
事務處理不僅是C#語言,其他語言也涉及事務處理。現在系統多采用的是多核CPU的服務器提升了處理器和計算機系統的性能。事務處理的增多也是為了減少由于程序開發中的多表操作而造成的信息丟失或者程序死鎖的問題。
事務處理的實質就是將多條SQL語句封裝,并用Begin開頭,End結尾,進行統一執行,當其中一條發生錯誤時,則事務回滾,之前的語句結果不提交。
由于現在的軟件系統越發復雜,越來越多的軟件系統涉及了多表操作,事務處理愈發重要,但是當使用事務處理時,效率也是要考量的一個重要因素,不當的事務處理會導致數據內存被大量的占用而造成系統繁忙的出現。所以在處理事務尤其是大規模事務時,SQL語句的編寫也是非常重要,處理事務時SQL語句盡量采用參數化編寫方式,這樣會減少數據庫對SQL語句的解析時間,降低系統崩潰的概率。
(3)C#容錯機制三:適度的垃圾回收。
系統又卡住了,怎么辦?
這是C#的WINFORM工程師經常遇到的問題,尤其在用戶和界面以及數據庫進行頻繁的數據交互的時候。但是C#語言本身就有垃圾回收機制啊,為什么還會那么慢呢?這時候往往的處理方式是增加GC,進行手動的垃圾回收。這樣做開始可能會起到一些效果,但是當使用的時間長了,WINFORM系統仍然會逐漸的變慢。這是什么原因呢?
這是我們的程序使用了很多C#的回收程序,出發點是好的,但這樣反而導致系統經常性的崩潰,在仔細的走查代碼過后,發現是由于垃圾回收程序使用過多,導致垃圾回收反而超過了程序所占用的內存,才導致的崩潰現象出現。所以在后期的修改后,將垃圾回收統一到一處,變成根據時間和內存占用程度智能回收內存垃圾,系統就逐漸正常了。其根本的思路是讓系統使用內存,而不是讓回收機制占用內存,在系統使用內存達到一定的量,或者達到一定的時間時,在進行內存的釋放,會起到意想不到的效果。
(4)C#容錯機制四:成熟的軟件復用。
軟件復用是在應用系統開發中利用已有的開發成果,消除了包括分析、設計、編碼、測試等在內的許多重復勞動,從而提高了軟件開發的效率;同時,通過復用高質量的已有開發成果,避免了重新開發可能引入的錯誤,從而提高了軟件的質量。
C#中主要采用引用DLL文件的方法做引用,實現成型的代碼復用。同一開發團隊的開發過程中,也可以利用同事寫好的底層代碼來提升自己的編寫效率。
復用看似是一種減少代碼量,提高寫作效率的方式,其實也是極大的避免了代碼錯誤。如果系統中大量的采用封裝的成型代碼,會使得系統的編寫過程快捷靈活。并且這些特定的代碼由特定人進行編寫,更分工明確清楚。極大的提升了系統的健壯性。使得后期維護和管理更加的方便,快捷,能迅速的反應,并定位到人。
以上四點就是本人經過大量的項目試驗和總結,對于C#或者說軟件容錯機制的理解,可能很多理解還有不到位的地方,那就需要更多的經驗的積累和提高,未來隨著C#的開源之路的進行,.NET平臺也會走上跨平臺的道路,未來會有想LINUX、安卓、IOS等其他的系統平臺使用.NET平臺,其相關的容錯機制會變化的越來越多,但是其核心內容仍然是使編程語言效率提升。未來的編程語言也將向著更加簡單化,封裝化,低耦合化的方向迅速的發展。