l

2014年1月3日 星期五

例外處理PK容錯設計

Jan. 02 21:30~21:52

螢幕快照 2014-01-02 下午9.48.20

 

Teddy:考考你。

鄉民甲:儘管考。

Teddy:例外處理就是要在程式裡面處裡遭遇到的例外,對不對?

鄉民甲:是啊(這是陷阱題嗎?!)。

Teddy:請問遇到NullPointerException要怎麼處理?

鄉民甲:嗯,NullPointerException通常是變數忘了初始化,如果要處理的話,程式可以這樣寫:

螢幕快照 2014-01-02 下午9.37.59   
圖一

鄉民甲:如果list這個資料成員忘了初始化,在foo()函數裡面可以捕捉NullPointerException,然後初始化list,這樣foo()就可以正常執行了。你看我的例外處理學的還不錯吧。


Teddy:決定要不要誇你之前再問你一個問題,「你確定圖一的程式作法是屬於例外處理」?

鄉民甲:(果然有陷阱…看我的水母神功…)try、catch、NullPointerException都派上用場了,這不是例外處理,什麼才是例外處理?

***

請鄉民們回憶一下Teddy在〈Fault、Error、Failure、Exception〉這一篇裡面關於fault、error、failure、exception的關係圖,重繪如下。

clip_image002

圖二

 

當一個軟體元件發生error,必須加以處理以免error變成failure。根據Knudsen[1]的看法,錯誤處理(error handling)可以分成兩類:


  • Exception handling:例外處理,負責處理component fault(可預期的錯誤狀況)。
  • Fault-tolerant programming:容錯設計,負責處理design fault(不可預期的錯誤狀況)。

由於程式語言只提供了例外處理機制,並沒有特別幫容錯設計安排額外的機制,因此無論是上述分類中的「exception handling」或「fault-tolerant programming」,在實作層面都可以採用程式語言的例外處理機制來達成。這也是造成混淆不清的地方,因為當我們在談「例外處理」或是「錯誤處理」的時候,有可能是指「exception handling」,也可能是指「fault-tolerant programming」。

鄉民甲:那又怎麼樣,反正都是錯誤處理啊?

當然不一樣,因為兩者的成本不同。回到圖一的程式碼,在程式中所捕捉的NullPointerException是一種design fault,表示程式中存在一個忘了初始化list物件的bug。如果真的要在程式裡面用例外處理的方式來處理design fault所造成的錯誤,此時就已經從「exception handling」提升到「fault-tolerant programming」。

兩種錯誤處理的方式,何者成本較高?當然是「fault-tolerant programming」。以NullPointerException為例,試想一下,程式中幾乎每一個使用到物件的敘述都有可能發生NullPointerException。如果真的要在程式中考慮到用例外處理的方式來復原NullPointerException所造成的程式錯誤,這是一件多個可怕的工程?

容錯、容錯,顧名思義就是「要容忍程式裡面的錯誤,就算是程式有錯系統也必須要正常執行」。容錯設計通常是使用在需要非常高強健度等級的應用系統,例如飛機控制系統、軍事用途系統、衛星或太空梭控制系統等。由於對於可靠性的要求非常高,具備容錯功能的系統開發成本也比一般商用系統高出很多。

***

身為一位軟體開發人員,你的客戶可能曾經告訴過你:我們公司生意做很大,一秒鐘幾十萬上下,這個系統你們要好好做,不允許有當機的情況發生。看來你的客戶心中要求的是一個具備高強健度等級與容錯功能的系統,很可惜他們為這個系統所準備的經費,只「請得起猴子」。當下次再聽到客戶對於強健度要求的時候,鄉民們要豎起耳朵,注意分辨客戶要求的是「exception handling」還是「fault-tolerant programming」,後者所需的經費與時間絕非前者可比擬。

話說回來,一般人連「exception handling」都沒時間做了,哪可能做到「fault-tolerant programming」。不要想這麼多,還是洗洗睡吧。

***

友藏內心獨白:記得當時年紀小,也曾經好傻好天真,想要在程式裡面處理NullPointerException。




[1] J.L. Knudsen. “Exception Handling versus Fault Tolerance”, in ECOOP’2000 Workshop W2. 該文章可在此處下載

沒有留言:

張貼留言