l

2013年11月5日 星期二

例外處理機制(4):Continuation

Oct. 30 11:10~12:10

image

 

Continuation

Exception continuation又稱為exception model,規範當exception handler執行完畢返回控制權之後程式的執行流程,常見的exception model包含以下三種:

  • Termination model:當exception handler裡面的程式碼執行完畢之後,程式控制權並不會返回原本發生例外的那一行指令,而是直接終止原本指令的執行。C++、Java、C#這些程式語言都是採用termination model。以下面程式片段為例,try clause裡面的aIS.readFully(messageBody)這一行程式如果發生EOFException,則程式流程會跑到catch(EOFException e)這個exception handler身上。當exception handler執行完畢之後,控制權並不會返回aIS.readFully(messageBody)這一行程式碼。

image_thumb7

 

  • Resumption model:執行完exception handler之後,會繼續執行原本例外發生的那一行指令。早年的Visual Basic就支援這種模式,當例外處理完畢之後,可以用resume或是resume next指令,讓程式控制權返回例外發生的那一行(resume)或是下一行(resume next)程式。
  • Retry model:結合termination mode與resumption model於是產生了retry model。執行完exception handler之後,會先終止原本例外發生的那一個區塊,然後再重新執行一次整個區塊。Eiffel和最近很流行的Ruby都支援retry model。

Eiffel程式範例,第27行的retry指令會重新執行一次method body的內容。在網路上查了一下,Ruby的例外處理也參考Eiffel的設計。

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

***

程式語言可以支援一種以上的exception model,但是為了設計上的簡化起見,目前主流的程式語言大多只支援termination model。因為有人證明過,可以在termination model模擬出另外兩種model。但是,如果鄉民們所採用的程式語言預設只支援termination model,那麼在設計例外處理的時候,像是retry這種很有用的技巧就比較容易被忽略。反之,在Eiffel或Ruby這種直接支援retry model的程式語言裡面,採用retry這種例外處理策略則是家常便飯。

***

友藏內心獨白:有時候,擦完屁股之後不要只顧著穿上褲子走人,還要記得回頭看一下拉出來的黃金的形狀與質量是否屬於「健康狀態」挑眉質疑

1 則留言:

  1. Hi Teddy

    我想問一下,針對 termination model 如何實作 resumption model 的方法?
    有推薦作法的文章嗎??

    回覆刪除