close

這世界上每個被設計出來的器具,都有它預期使用的條件,和使用的方式,如果超出這樣的預期,這件器具就會不正常 -- 可能是壞掉,或是產生不可預期的後果。

譬如說:一張椅子,預計只能承重100公斤,如果超過這個上限,椅子就會垮掉 -- 這叫超出預期的使用條件。而一張椅子,只能被屁股坐得四平八穩,如果翹着椅子,或甚至是當馬騎,也會讓椅子壞掉,或是讓人跌倒 -- 這叫做超出預期的使用方式。

而我們寫程式的人,把這種狀況叫做Exception。

==

沒寫過程式?不知道什麼是Exception?好,我再舉個例子來說明(明明就自己愛講......)

現在的電梯門如果在關起來的時候夾到東西,門會很聰明地打開,可是一開始的設計並不是這樣的 -- 關就是關,不管遇到什麼阻礙就是要關,於是被夾到的東西就會陷入進退兩難的困境,於是驗收的人就跑去罵電梯門啦:「難道你不知道夾到東西的時候要打開嗎!?」

電梯門沒有考慮到有人的動作比較慢,門都要關了還沒出去,這超出了他的預期,所以產生了一個Exception -- 所以把人夾得進退兩難。但是電梯門很貼心,他不想要老是夾的人鼻青臉腫,所以他多了一個“開”或是“延長開”的按鈕,讓一些行動比較不方便的人,有比較寬裕的時間進出電梯。可是他又沒想到,不管他開多久,還是會有人匆匆忙忙地在最後一刻才要搶進電梯 -- 又是一個Exception。所以他又讓自己更進步了一些:ㄧ夾到東西,門就重新打開。

從此之後電梯門就很少再發生夾到人的Exception。

不過電風扇就沒有這麼好講話了,電風扇ㄧ跑起來,除非關掉,就沒有再停的 -- 所以如果有手指頭伸進去,不是手指頭斷掉風扇繼續轉,就是風扇葉片斷掉,手指頭繼續轉。雖然電風扇也知道這個狀況常發生,但他就是不想要處理這個Exception,一定要弄個兩敗俱傷,才肯罷休。

==

而我在當爹之前,我的main function跑得雖然不是說很順,但也沒有什麼太讓人意外的exception發生,我總是可以照著自己的步調前進、停止,一切是這麼樣的得心應手。

但阿竹出生之後,我的main funtion突然到處都會丟出exception,厲害的是我完全不知道exception的type,而這些exception也沒有繼承自同一個root object,但最可怕的莫過於我周遭的親人開始也會跟著丟exception到我的main function來要我處理......連晚上執行的Thread.sleep都沒有好好的一次跑完,到處都是context-switch,然後我不斷地try-catch,try-catch......

然後我昨天突然懂了 -- 

當阿竹把手伸進馬桶裡摸尿尿的時候 -- 這不是exception。

當阿竹把垃圾桶裡的肉鬆撿起來吃的時候 -- 這不是exception。

當阿竹沒禮貌地對著我大吼大叫的時候 -- 這不是exception。

當我不再用try-catch的方式來處理,而是和阿竹之間試圖建立一些interface之後,我可以透過傳遞一些阿竹可以接受的參數,讓她的手在伸進馬桶之前讓她自己先做一次if-else的判斷,讓垃圾桶裡的肉鬆在進到她嘴巴前就被她自己delete掉,讓她對著我大吼大叫之前把polite這個變數先初始化。我的main function突然又輕鬆了起來 -- 不應該把這些狀況當做exception來處理,這些應該是阿竹的main function。

==

後記:

我本來嘗試著去寫得讓不懂程式的人也懂,但看起來功力還是不夠......Orz

倒是寫完這篇,我覺得自己coding的功力又進步了XD

 

arrow
arrow
    全站熱搜

    孩子的爹 發表在 痞客邦 留言(2) 人氣()