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