徐瑱,2013年初步涉及云計(jì)算行業(yè)。并出任首席架構(gòu)師的職位,熟悉Java、C#、C/C++等開發(fā)語(yǔ)言,做過(guò)超過(guò)10個(gè)以上的大型項(xiàng)目分析、設(shè)計(jì)經(jīng)驗(yàn)。目前,服務(wù)于是上海新致云產(chǎn)品研發(fā),負(fù)責(zé)新致云的架構(gòu)設(shè)計(jì),以及運(yùn)維服務(wù)。并負(fù)責(zé)新致云技術(shù)架構(gòu)及基礎(chǔ)技術(shù)平臺(tái)建設(shè)。
新致云是目前云服務(wù)行業(yè)內(nèi)少有的為客戶同時(shí)提供IaaS、PaaS、SaaS服務(wù)的云服務(wù)提供商,具備多年云計(jì)算開發(fā)經(jīng)驗(yàn)的資深程序猿,我們也會(huì)經(jīng)常就項(xiàng)目開發(fā)中所遇到的問(wèn)題進(jìn)行討論,在此與各位IT大牛們一起分享我們?nèi)粘i_發(fā)中所總結(jié)的經(jīng)驗(yàn)。
眾所周知,對(duì)于判錯(cuò)處理的設(shè)計(jì),傳統(tǒng)的設(shè)計(jì)思路是設(shè)計(jì)檢查代碼。而在現(xiàn)代程序設(shè)計(jì)中,同時(shí)也提供了異常處理機(jī)制。但是如何合理恰當(dāng)?shù)剡x擇反而成為了程序設(shè)計(jì)者所困擾的一個(gè)問(wèn)題,特別在性能敏感的場(chǎng)合,更是分歧嚴(yán)重。
我就試圖就這個(gè)問(wèn)題展開一些討論
使用檢查機(jī)制來(lái)處理各種錯(cuò)誤情況的方法,不難發(fā)現(xiàn)其開銷是非常輕量的,并且在代碼的復(fù)雜度上,與異常處理并沒(méi)有太大差別。而異常機(jī)制,相對(duì)較為復(fù)雜。下面我們就選擇Java語(yǔ)言來(lái)看下異常機(jī)制的一些特征。
提起異常的特征,第一感覺就是非常昂貴。為什么呢?因?yàn)槲覀冃枰东@異常堆棧的當(dāng)前狀態(tài)。而且這還不是開銷的所有,只是個(gè)開頭。還有一些其他的特征,包括 可以創(chuàng)建、可以被捕獲、表示為第一級(jí)對(duì)象、繼承深度3級(jí)以上等等。異常對(duì)象與正常對(duì)象最大的區(qū)別,就是它們可以被拋出和捕獲。
接下來(lái)我們看下處理異常的流程
JVM通過(guò)拋出athrow指令來(lái)拋出異常。該指令會(huì)使得JVM將異常對(duì)象彈出異常堆棧,然后JVM通過(guò)搜索當(dāng)前執(zhí)行堆棧幀來(lái)得到第一個(gè)Catch子句來(lái)處理該類或者其超類的一個(gè)異常。如果沒(méi)找到,那么需要釋放當(dāng)前的堆棧幀,在下一個(gè)堆棧幀中重新拋出。這樣一直到找到包含匹配的Catch子句的堆棧幀,或者到達(dá)異常堆棧的底部。如果一直沒(méi)有找到,所有的堆棧幀都會(huì)被釋放,線程會(huì)在ThreadGroup對(duì)象有了被處理異常的機(jī)會(huì)后被中止。如果找到,則程序計(jì)數(shù)器被重置到Catch代碼的第一行。
從上述可以獲知,相對(duì)于類型檢查,拋出異常的處理實(shí)在是非常昂貴的。而且,針對(duì)異常的處理,跟普通一級(jí)對(duì)象并沒(méi)有特殊區(qū)別。我們可以得出一個(gè)結(jié)論就是異常機(jī)制應(yīng)該為異常的情況保留。在超過(guò)函數(shù)邏輯本身的特殊情況下,使用異常處理是一個(gè)合適的選擇。在無(wú)異常的情況下,還是通過(guò)檢查來(lái)避免使用異常拋出從而可以得到一個(gè)對(duì)于較優(yōu)的選擇。
以上是我以Java開發(fā)為例所分析的異常機(jī)制的一些特征,在日常新致云的項(xiàng)目開發(fā)中,經(jīng)常會(huì)遇到一些新鮮有趣的問(wèn)題,后續(xù)會(huì)為大家呈現(xiàn)更多在開發(fā)中遇到的問(wèn)題和解決方案。