l

2013年10月30日 星期三

例外處理機制(1):Representation and Definition

Oct. 28 17:12~18:08

螢幕快照 2013-10-28 下午5.17.46

 

原本就打算從北京回來之後要把《例外處理設計與重構的逆襲》(書名暫定)這本書寫完,拖了一個禮拜,剛剛打開幾個月前整理好的草稿,目前內容有四萬五千字左右,大部分章節都已經有了雛型,剩下「例外處理機制」以及少數零散的主題還沒寫。每天要寫部落格又要寫書,時間實在不夠用。拿出老招,就先在部落格上撰寫草稿,之後再修改成書籍內容。這種行為,就是傳說中的「一兼二顧,摸蜆仔兼洗褲」(一石二鳥)熱戀

所謂「例外處理機制」就是程式語言裡面用來支援例外處理的方法,主要包含以下六個元素:

  1. Representation:如何表達一個例外?
  2. Definition:如何定義一個例外?
  3. Signaling:如何產生一個例外的實例(instance)?
  4. Propagation:如何傳遞一個例外?
  5. Resolution:針對一個例外,如何找到可以處理它的程式片段?
  6. Continuation:例外發生之後,程式的控制流程該如何進行?

***

今天先介紹前兩個元素:RepresentationDefinition。程式語言表達例外的方法有三種,分別是:

  1. Symbol:用字串或是整數來代表一種例外狀況,Eiffel語言的例外就是屬於這一種。為什麼要用字串或整數來代表錯誤?答案很簡單,就是想要降低用物件表達錯誤所造成的系統效能減低的可能性。
  2. Data Object:用物件來表示與儲存錯誤訊息,這是最常見的表達例外方法,Java、C++、C#的例外都屬於這一種。基本上這種類似的例外表達方式,例外物件身上沒有什麼行為,單純以物件的形式來做為資料使用。
  3. Full Object:除了用物件來表示與儲存錯誤訊息,連如何產生一個例外實例、傳遞例外、例外發生之後的程式控制流程等,全部都定義在例外類別之中。Smalltalk的例外就是屬於這一種。

例外如何定義與例外的表達方式息息相關,定義例外的方式有兩種:

  1. Symbol:如果例外是用Symbol來表達,那定義例外的時候當然就是使用字串或是整數。
  2. Data Object與Full Object:不管是採用data object或是full object來表達一個例外,都會使用一個新的類別(class)來定義例外。

鄉民們可以自己練習一下,看看自己曾經學過的程式語言,其表達與定義例外的方式是屬於上述的哪一種。

***

看到這裡Teddy想請鄉民們思考一個問題:「為什麼要了解例外處理機制?

以前Teddy在學習一個新的程式語言的時候,不管是VB、C++、Eiffel、Java、C#、還是VB.NET,當學習到這個語言的例外處理方法的時候,都存在一個疑問:「到底怎樣才算是把這個語言的例外處理方法給學完整了?」以Java為例,try-catch-finally、throw、throws這幾個關鍵字的意義和語法很快就懂了,但是總覺得光是知道語法好像還是有一種很空虛的感覺,還是不太清楚要如何著手例外處理設計。

到底一個程式語言在設計例外處理方法的時候,要考慮那些項目呢?知道了這些項目,當鄉民們在學習一個程式語言的例外處理方法的時候,就有了很清楚的「學習驗收條件」。此外,也可以依據這些項目來比較不同程式語言之間的例外處理方式的差別,有助於整理與融會貫通。這就是為什麼需要了解例外處理機制的原因。

***

友藏內心獨白:看完之後覺得還蠻簡單的。

1 則留言: