l

2013年10月31日 星期四

例外處理機制(2):Signaling and Propagation

Oct. 29 10:56~12:15

image

 

Signaling

把例外的實例(instance)傳遞給例外接收者的這個動作叫做signalingthrowingraisingtriggering,以Java為例,透過throw這個關鍵字來把例外往外拋,請參考以下程式片段:

image 
image

 

從signaling的角度來看,例外產生的方式有可分為兩種形式:

  • Synchronous exception:同步例外,因為我們所呼叫的指令或method執行失敗所產生的例外。
  • Asynchronous exception:由執行環境(例如JVM)所主動丟出的例外,和目前程式所執行的指令或method沒有直接的關係。例如,執行環境偵測到內部錯誤或是記憶體不足而丟出一個例外,像是Java的OutOfMemoryError就屬於非同步例外。

大部分的例外處理設計所談論的議題在於要如何來處理同步例外,當非同步例外發生,通常表示執行環境已經產生了嚴重的錯誤,此時最好的辦法就是結束程式執行,避免一錯再錯。

***

Propagation

Propagation討論例外傳遞的問題,例如method A呼叫method B,在method B裡面產生了一個例外,但是這個例外卻沒有被method B給處理(捕捉住),則該例外可能會被傳遞到method A身上。

例外傳遞的方式分成兩種:

  • Explicit:接收到例外的人,如果不想處理這個例外,則必須要明白的指出要把這個未被處理的例外往外丟。Java的checked exception就屬於這種類型,如果某個method遇到一個checked exception但卻不想處理它,則必須要把這個checked exception宣告在method signature上面。雖然在程式裡面不需要先捕捉這個checked exception然後再把它re-throw出去,但是廣義的來看,要求把不想處裡的例外宣告在介面上面,這樣也算是一種explicit propagation。

下列Java程式片段,其中aIs.readInt()aIS.readFully(messageBody)這兩行都會丟出IOException,但是這個method並不想處理它,所以把IOException宣告在method signature上面往外傳遞。

image

 

  • Implicit:接收到例外的人,如果不想處理這個例外,在預設的情況之下,例外會直接往外傳遞,不需要特意指定要把這個未被處理的例外往外丟。Java的unchecked exception,以及C#所有exception的傳遞方式,就屬於implicit的方式。

下面C#程式範例,其中第4、5兩行程式都可以會產生例外,但是因為C#的例外傳遞方式是採取implicit propagation,所以如果writeFile() method不想處理這些例外,也不需要特別指定要把它們往外丟,在預設的情況下這些沒有被捕捉的例外就會自動往上傳遞。

image

***

友藏內心獨白:Explicit propagation好像有點小麻煩,但有沒有好處呢?

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這幾個關鍵字的意義和語法很快就懂了,但是總覺得光是知道語法好像還是有一種很空虛的感覺,還是不太清楚要如何著手例外處理設計。

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

***

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

2013年10月29日 星期二

培養自己的看法

Oct. 28 11:32~13:00

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

 

結束了短暫九日的北京之行,回到台北也已經過了一個禮拜,原本預計要開始撰寫例外處理設計與重構的書籍,但這幾天卻打不起精神。上回出國到緬甸,回國之後狂拉了一個多禮拜,此次回國身體正常,但心中卻還期待著下一次的休息,這可能是年紀越來越大、人變得越來越懶惰的一種跡象挑眉質疑

待在北京短短的九日,覺得北京的都市硬體設施已經領先台北許多。別的事情不談,光是馬路與人行道平整這種「表面工夫」這麼多年來台北怎麼也做不好。記得前幾年台北舉辦花博,Teddy走在花博圓山園區的入口,廣場上的地面凹凸不平,施工品質真的令人不敢苟同。當時Teddy心裡就在想,這些來參觀花博的市政府大官們,腳底下穿的到底是哪一個牌子的鞋子,怎麼都感受不到廣場地面不平整的這個事實呢?還是官員們已經養成「此為正常現象,請安心服用」的習慣?

寫到這邊突然想到之前看了一部對岸的電視劇,內容講述明朝開國皇帝朱元璋的故事…

朱元璋:此處石板用料為何如此輕薄?

李善長:啟奏皇上,臣想此處用料恐怕是偶有疏失。

朱元璋:偶有疏失?(經過一番檢查之後)貪官,這裡面必定有貪官!

Teddy內心獨白:就算不是貪官,也很可能是一名庸官。

 

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

北京的廣場與人行道大致來說都非常平整,平整的程度直逼日本。可惜在北京地面上,口香糖屍體出現的比例也不低挑眉質疑

***

北京什麼都大,馬路大,建築物規模大,連逛街的地方都很大,整體給人一種「明天會更好」的感覺。不像台灣,在官員、媒體、名嘴、酸民的通力合作之下,瀰漫著一股失敗主義(Teddy有時候也是酸民的一員啊不要告訴別人)。還好台灣的「公民與道德平均分數」目前講起來應該還是比對岸要高一些。對岸人口眾多,在短時間內「公民與道德平均分數」要趕上台灣恐怕還需要加緊努力。

***

Kay從圖書館借了一本吳祥輝所寫的《驚恐日本》,因為曾經到日本旅遊過幾次,這本書讀起來比起吳祥輝的前幾本關於北歐的書要來的更有感覺一些。一般提到日本,大部分人的感覺是進步、乾淨、整齊、有禮貌、準時。除了這些大眾觀點之外,吳祥輝本人或透過他老婆Catherine的角度,在書中也提出了一些自己的看法。例如:

  • Catherine覺得日本的人行道鋪的並不平整,因為有些地方用小塊的磁磚/石磚鋪設而成,對於穿高跟鞋的人來講走起路來很不方便。
  • 吳祥輝認為日本過於注重「經濟利益最大化」與「紀律」,有時不免會導致僵化與不靈活,缺少創新能力。

前一陣子Teddy讀了「大野耐一」的《追求超脫規模的經營》這本書,書中提到他在豐田汽車提倡「多能工」的時候,遇到很大的阻力。但他相信:「雖然在美國不可能的事,在日本要有決心、有毅力的話,是可能辦的到的。」大野耐一的這種精神很值得佩服,但讀了吳祥輝的書之後,像是「把什麼東西都推到極致,真的是好的嗎?」這類的問題,也會開始出現並盤旋在Teddy的腦中。

***

古人說:「盡信書不如無書」,說來簡單,但是要擺脫人云亦云,建立自信、具備獨立思考的能力,同時又要避免陷入「夜郎自大」與「井底之蛙」的窘境,還真不是一件容易的事。

***

友藏內心獨白:教別人敏捷容易,自己要敏捷卻很困難啊。

2013年10月28日 星期一

C. C. Agile 聚會Sprint 14 精華報導與投影片分享

Oct. 27 22:16~22:53

螢幕快照 2013-10-27 下午10.49.37

 

10月份的C. C. Agile聚會由泰迪軟體的Erica分享:「好設計如何好-從解構作用力(Force)談起」。台灣 人很喜歡趕流行,人家有的我們也要有。在這種炒短線的「抄襲 參考別人作品」的風氣之下,最後的作品往往品質低劣,慘不忍睹。Erica給了以下兩個例子。

螢幕快照 2013-10-27 下午10.27.37螢幕快照 2013-10-27 下午10.27.54

螢幕快照 2013-10-27 下午10.28.58螢幕快照 2013-10-27 下午10.29.08

 

草率「參考別人作品」的結果,只學到表面,但卻不瞭解原始作品的精隨

螢幕快照 2013-10-27 下午10.28.50

 

Erica介紹Christopher Alexander的設計方法,主要的內容來自Alexander所寫的《Notes on the Synthesis of Form》這本書。

螢幕快照 2013-10-27 下午10.36.43螢幕快照 2013-10-27 下午10.36.53

 

Alexander的方法包含以下四個步驟:

  1. 區分Context與Form。
  2. 找出影響Form的Forces。
  3. 把相關的Forces聚集在一起,並設計一個Form來平衡這些Forces。
  4. 把設計好的Form放回Context裡面,評估這個Form是否和Context很「速配」。

螢幕快照 2013-10-27 下午10.39.48

 

接下來Erica舉了一些例子來解釋上面四個步驟(以下省略N張投影片的內容熱戀),最後提到一個重點:抄襲好設計的作用力(forces),而非直接照抄它表面的形式

螢幕快照 2013-10-27 下午10.42.42

***

以下是Erica當天分享內容的投影片,有興趣的鄉民們請自行服用。

***

友藏內心獨白:鎖管是哪招啊?

2013年10月27日 星期日

2012緬甸考察之旅Day2-B金色宮殿僧院、固都陶佛塔

Oct. 22 13:28~14:22

金色宮殿僧院

離開馬哈牟尼佛塔之後來到金色宮殿僧院(Shwenandaw Kyaung),又稱為柚木寺。根據網路上查到的資料,這個建築原本位於皇宮之中,是敏東王(缅甸貢榜王朝君主,在位期間為1853年至1878年)與皇后的寢宮,也是敏東王駕崩的地點。敏東王的繼任者為了避諱,把整座建築拆掉搬出宮外,變成一座僧院。

整座建築用數百根柚木蓋成,建築外圍也有精美的木雕裝飾,非常漂亮。

螢幕快照 2013-10-22 下午1.30.20螢幕快照 2013-10-22 下午1.29.59螢幕快照 2013-10-22 下午1.29.11螢幕快照 2013-10-22 下午1.29.23螢幕快照 2013-10-22 下午1.29.32螢幕快照 2013-10-22 下午1.34.12螢幕快照 2013-10-22 下午1.31.28螢幕快照 2013-10-22 下午1.31.42螢幕快照 2013-10-22 下午1.31.49螢幕快照 2013-10-22 下午1.29.45螢幕快照 2013-10-22 下午1.30.48螢幕快照 2013-10-22 下午1.35.12

***

午餐

離開金色宮殿僧院之後去吃午餐,緬甸的菜份量都蠻多的,味道也還不錯,吃得還習慣。

螢幕快照 2013-10-22 下午2.03.59螢幕快照 2013-10-22 下午2.04.09螢幕快照 2013-10-22 下午2.04.28

 

固都陶佛塔

下午第一站來到固都陶佛塔(Kuthodaw Paya),此塔建於1857年修建完成,在此有729塊石碑,碑上刻有三藏經。

螢幕快照 2013-10-22 下午2.09.42螢幕快照 2013-10-22 下午2.10.01螢幕快照 2013-10-22 下午2.10.13螢幕快照 2013-10-22 下午2.11.10螢幕快照 2013-10-22 下午2.11.21螢幕快照 2013-10-22 下午2.12.11螢幕快照 2013-10-22 下午2.11.49螢幕快照 2013-10-22 下午2.14.11螢幕快照 2013-10-22 下午2.11.59螢幕快照 2013-10-22 下午2.11.30螢幕快照 2013-10-22 下午2.14.06螢幕快照 2013-10-22 下午2.14.37螢幕快照 2013-10-22 下午2.15.17 1螢幕快照 2013-10-22 下午2.14.48螢幕快照 2013-10-22 下午2.16.42螢幕快照 2013-10-22 下午2.15.38螢幕快照 2013-10-22 下午2.14.26螢幕快照 2013-10-22 下午2.16.30

 

在寺中巧遇兩個小朋友,一直要求Teddy和Kay幫她們拍照微笑,可惜沒辦法當場把照片洗出來拿給他們。

螢幕快照 2013-10-22 下午2.18.29螢幕快照 2013-10-22 下午2.19.09螢幕快照 2013-10-22 下午2.20.35

***

友藏內心獨白:到緬甸一定要穿拖鞋。