2014年11月30日 星期日

例外處理-物件導向語言的例外處理機制<1>

2014/11/29 23:31

最近向圖書館預約的書終於到手上了,這本書就是Teddy老師的『例外處裡設計的逆襲』,目前看了78頁,很多地方都是看一看就忘了,前面大部分是一生日常生活的例子,Teddy老師將這些例子以程式設計的觀點去討論和分析,還有加上自己許多生動的主觀感受,還挺佩服Teddy的文筆,在我看來很一般且沒什麼感受的事件上,竟能寫得屬此生動,甚至還可以將它轉由專業理論的觀點去描述,讀起來頗有趣,希望自己在讀到最後也能稍微吸收一點點這恐怖的感受吸收力。

70頁這邊開始,開始說明目前物件導向語言的例外處理機制,開頭就拋出了十個名詞:

1. Representation
2. Declaration
3. Signaling
4. Propagation
5. Attachment
6. Resolution
7. Continuation
8. Cleanup
9. Reliability Check
10. Concurrency

自己有先掃過大概一兩次,掃完之後在腦袋重新問自己一次,發現自己竟然一項也沒有辦法解釋,於是往前翻,重新擬定小小目標,先背其中4項就好...

Representation
這個名詞是在述說在程式語言中例外(Exception)所代表的形式,主要分為以下三種:
1. 符號(Symbol)
用整數或字串代表例外。
2. 資料物件(Data object) 
用物件(Object)代表一個例外,這個例外物件本身並不包含任何的例外處理流程。我常常寫的Java語言就是屬於這種表示形式。
3. 完整物件(Full object)
也是用一個物件代表例外,但是與資料物件不同的地方在於,這種類型的例外物件,本身包含了例外發生的處理流程。

Declaration
向外丟出的例外處理是否要宣告在函數介面上,主要分為以下四種:
1. 強制式
編譯器會強制要求你把例外丟出或者處理掉,Java的受檢例外(checked exception),就是屬於這種。
2. 選擇式
宣告或不宣告都可以,Java的非受檢例外(unchecked exception)屬於這種。
3. 不支援
例外不可以宣告在函數介面上,編譯器不會強制規範使用者實作丟出例外,C#屬於這種。
4. 混和式
同時支援上述方法中的兩種以上,就是混和式,廣義來說,Java也屬於混和式。

Signaling
發生例外時,將例外實例丟給例外接收者的動作。主要分為以下兩種:
1. 同步例外(Synchronous exception)
執行函式時,發生例外,可以被程式本身捕捉到。
2.非同步例外(Asynchronous exception)
這種例外通常和函式本身沒有直接關聯,書中TeddyJava中的OutOfMemory就是屬於這種例外。

目前的程式語言中,大部分說的例外處理都是關注在同步例外的處理上,至於非同步例外,發生時通常程式很難再救回來了,所以Teddy建議我們還是把程式資源清一清準備收工,以免越救越糟。

Propagation
例外的傳遞方式,分為以下兩種:
1. 外顯式(Explicit)
如果例外不想在這個函式處理,就必須把它往外丟,Java的受檢例外(check exception)就是屬於這種。
2. 內隱式(Implicit)
不須特別實作丟出例外或捕捉例外,程式就會自動將例外往外丟。


Teddy的書中,每個名詞都會舉一個具體的例子,來讓我們更了解這些名詞要表達的意思,即使自己寫過不少程式,但是對於這些細細分類的名詞,還是體會得很辛苦啊...
一直被灌輸"會用就好"的思維,養成習慣之後,很容易把不同類型的事物歸類成一樣的東西,或者把這些東西直接看成一個未知數X,然後幻想能不能用自己所會的一招打天下,我好像已經忘了該怎麼將理論慢慢的累積上去。


我要一層一層疊回來→Teddy Chen 提醒我的那些事

沒有留言:

張貼留言