l

2013年11月1日 星期五

例外處理機制(3):Resolution

Oct. 30 09:54~11:05

image

 

Resolution

Exception resolution又稱為handler binding,探討如何找到一個例外處理程式(exception handler)的過程。尋找handler的方式,可以透過:

  • Static scoping:靜態範圍的意思是說只要光看程式碼的結構,就可以決定例外要丟給誰來處理。以下面這段程式碼為例,在try clause所丟出的IOException,直接被相對應的catch(IOException) clause所捕捉,所以只要依賴static scoping便可找到exception handler。
image_thumb2

 

  • Dynamic invocation chain:需要在程式執行期間透過call chain的關係來決定如何找到合適的exception handler,例如fetchRawBytesAndSetupMessage()這個method所丟出的IOException和InvalidPacketException將會由誰來處理?不知道,因為要看程式執行之後的呼叫關係,才知道如果fetchRawBytesAndSetupMessage()產生了例外,會被call chain上面的那一個method所處理。

image_thumb7

 

  • 以上兩者:同時參考static scoping與dynamic invocation chain。

***

如果是採用動態的方式來尋找exception handler,則尋找的方式又可以分成兩種:

  • Stack unwinding:程式執行的時候,method呼叫的順序形成了一個call chain,而這個call chain通常被執行環境保存在一個stack裡面。stack unwinding的意思是說,沿著這個stack一層、一層往外找,一直到找到一個合適的exception handler為止。
  • Stack cutting:另外一種尋找的方式則是把exception handler放到一個list(串列或是陣列)裡面,當例外發生的時候,到這個list去尋找是否有合適的exception handler。

最近發生了「監聽門」事件,剛好可以用來解釋以上兩種不同的方法。當檢察總長發現到疑似司法案件關說的「常態 例外」情況,如果採用stack unwinding的方式,檢察總長應該是逐層向上回報,如下圖所示。

螢幕快照 2013-10-30 上午10.41.42

 

但是,可能是因為這個「例外」牽涉到「法務部長」,於是檢察總長便改採stack cutting的方式來尋找他心目中合適的exception handler。假設行政院長與總統都曾經向檢察總長表示過「遇到問題可以來找他」,在「監聽門」的這個例外情況之下,經過判斷檢察總長覺得「總統」這個exception handler比較 夠力 合適,於是選擇了把這個例外丟給總統來處理。

 

螢幕快照 2013-10-30 上午10.50.51

***

尋找合適的exception handler,以及exception handler本身是否能夠妥善處理例外,都是很重要的議題。試想一下檢察總長把「例外」丟給總統這個「exception handler」的下場,不但一開始exception resolution的過程就有可議之處,「exception handler」本身的實作方式也不好。這個故事告訴大家,例外處理真的很重要啊挑眉質疑

***

友藏內心獨白:例外處理守則第一條,請先確定發生的事件是不是一個例外。

沒有留言:

張貼留言