網路城邦
上一篇 回創作列表 下一篇  字體:
不要隨便踹(Try)啦
2014/02/06 09:41:57瀏覽898|回應0|推薦7

相信多數專業程式師都知道TryCatch這樣的程式技巧,正式一點的名稱叫做「捕捉錯誤」,就是某個動作,尤其是與網路有關的,可能偶爾會有例外狀況出現,譬如網路中斷,為了避免程式直接當掉還不知道原因,就會加上這樣的語法,至少在Catch部分讓錯誤訊息顯示出來供程式師參考,如果知道是哪種錯誤當然應該在此寫處理錯誤的程式。

但是我想很多人都會像我一樣常常偷懶,將它當作「忽略錯誤」的工具,就是在Catch部分也不寫程式,於是程式明明在此遇到了錯誤,但只當沒事繼續執行下去,程式不會當掉,但是可能程式師自己也不知道錯誤的原因,就是鴕鳥心態唬弄過去了!這不太負責任。但現實是:主程式千萬不能當掉!所以寧可讓程式忽略小錯誤,個案事後補救,也不能使主系統停擺,讓所有用戶一起開罵!

其實在開發複雜網路程式的初期,程式中用很多踹(Try)也是合理的,因為要先讓主線車道在正常狀況下能通車,之後再處理一些例外狀況。只是如果沒有客戶的抗議,像是eTag誤判超收通行費這樣的事情,很多程式師就會懶得去處理好多年才發生一次的意外狀況,或許那時我都不在這個工作上了!當然成熟的程式中應該盡量不繼續用「踹」,就是每個狀況都要預先判斷與處理好,不讓程式有任何機會意外的當掉,這才是負責任的態度。

不過最近我碰到的狀況給了我一個不能常常「踹」的另一個重要原因!就是即使沒有發生任何錯誤,一旦使用這個語法就會讓程式變慢。頻率不高時我們不太感覺,但是如果在迴圈中使用,次數頻繁下就會產生很大的副作用,慢到可怕!

緣起於我的車牌辨識系統資料漸漸多了,搜尋起來當然也越來越慢,要在大約50天,一天七八十萬筆,總共三四千萬的資料中找一個車牌,時間甚至會超過一分鐘!聽起來似乎還好,資料多嘛!但是考慮到我們用的是如此高檔的電腦,甚至有高速磁碟陣列,這樣還是太慢了!雖然比前一版有線電視工程師作的舊資料庫好很多,但是找個車牌一分多鐘還是會讓警察杯杯們○#%*的。

我努力分析測試了好幾天,最後抓出來的大懶蟲原來就是「踹」先生!因為系統每天每個站會因應辨識資料所需自動產生一張資料表,但是不保證每天每站都有正常運作(鏡頭或電腦壞了),所以有些「應該」有的表因為沒資料寄來,其實是不存在的!為了避免程式搜尋時因為嚐試開啟不存在的資料表而當掉,我理所當然地用「踹」的!開不成就算了,找下一張。但是因為表的數量已高達五千多張,每個踹的動作即使沒有真的發生錯誤,也會比不用踹得慢很多!

測試結果是不用踹語法的搜尋時間比用踹的時間快兩倍以上!所以啦!分享此經驗給各位同行,「踹」是強力止痛劑,但是要審慎使用啊!不然有得苦頭吃了。

( 心情隨筆工作職場 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=yccsonar&aid=10981047