2014年12月13日 星期六

例外處理是什麼?

2014/12/13 14:42-15:22

最近把Teddy的書【例外處理設計的逆襲】,當作故事書看,休息的時候就會拿出來閱讀一番,當我在閱讀的時候,實驗室的同學們就會很好奇地問說,例外處理是什麼?經過我的解釋之後,他們普遍都認為和return差不多,其實剛開始,我也認為和return error code沒什麼差別,但是經過自己有Java設計程式的經驗加上書中的洗腦,總算能有些體會。


以下是和同學的對話...

同學:「例外處理能幹嘛?」

我:「當你執行Function的時候,有錯誤就會產生例外,例外發生的時候會通知使用API的人。」

同學:「那和回傳錯誤代碼有什麼不一樣,使用API的人透過回傳值就可以知道API有沒有執行成功了啊!」

我:「確實和回傳錯誤代碼沒有什麼不一樣,但是就我目前的體會,有例外處理的程式碼,可讀性會比較高,正常流程區塊的程式碼與錯誤流程區塊的程式碼容易分辨。」

舉個例子,
假設現在有三個Function:FunctionA、FunctionB、FunctionC,這三個Function都有可能會執行失敗,而現在有一個流程,須要這三個Function依序動作,流程才算完成,如果執行過程中,有一個Function出錯就不能繼續往下執行,現在我們依Error code和exception個別寫一段程式碼,程式以Java撰寫。


1.        使用Error code,回傳0代表執行成功:

if(FunctionA() == 0) {
    if(FunctionB() == 0) {
        if(FunctionC() == 0) {
             // execute successfully
        } else{
// FunctionC failed
}
    }
     else {
     // FunctionB failed
}
}
else{
// FunctionA failed
}

2.        使用Exception,沒有發生Exception,代表執行成功:

try{
    FunctionA();
    FunctionB();
    FunctionC();
} catch(FlowException e) {
    e.printStackTrace();
}


看完這兩個例子,是否有一點點感覺呢?
在我們想要重新閱讀程式碼的時候,方法2一目了然,很容易找到正常程序的程式碼區塊,當例外發生的時候,FlowException會帶有產生例外的的詳細資訊。

雖然方法1可以更改程式碼架構,能達差不多的效果,但是不管怎麼改,還是需要去判斷它的回傳值,才決定要不要繼續執行下一個Function,而在方法二中,不需要每個Function都逐步檢查,當例外發生的時候,只須要觀察FlowException裡面所帶有的資訊,就知道我們流程哪裡有出錯。


當然例外處理的好處不僅止於這個例子,目前讀了Teddy書有一百頁,書中在討論的時候,常常會出現前幾章的專有名詞,本來對於一堆專有名詞毫無感覺,但讀到現在,總算能區分在書中前幾章就出現的Error、Fault、Failure和Exception間得差異啦!


要說服別人之前,要先說服自己→自己體會到的那些事

沒有留言:

張貼留言