• 沒有找到結果。

常見例外故障情境與指令下法

3.2 設計原理

3.2.4 常見例外故障情境與指令下法

成了在〈章節 3.2.2 Catch-And-Retry 指令設計〉所述的基本設計方針。接下來就幾種 認為頻率最高的使用形式介紹如下:

(一) 指令基本順序

在本質上,剖面功能是沒有順序的因為每個都完全獨立。在實際上,多個剖面功能 修飾同一段原始碼時,到了調用剖面功能時還是存在著執行順序。首先回顧一下在〈章 節 3.2.2 Catch-And-Retry 指令設計〉所提,Catch-And-Retry 機制實務上執行段落共 分成十段,在指令設計上有五個指令型。用這五個指令把十段執行段落組織出來。

開始前先理解一點,AspectW 的剖面功能順序由上往下(或由外向內)包裹機制,而 例外由內向外傳遞。在這例子則包裹了五層,第六層是由 Do 函式包裹主功能邏輯程式 碼區塊。

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

這一段執行順序解讀如下:

 OnEnterLeave,當進入之前先調用 FooEnterAction,在離開之前調用 FooLeaveAction。

 Ignore,若後來發生了像 FooException 這類特定的故障狀況,就忽略不管。

 HandleFail,有些特殊的例外狀況必須調用自訂的 FooFailHandler 來決定 如何處置。

 Retry,若發生了故障就先稍停3秒(3000 豪秒),然後調用

FooRecoveryAction 做一些進階的自訂恢復操作,然後再重試但上限為2次。

 Restore,當出現故障時立即還原物件本機端物件 “bar” 的狀態。

這個例子並非是常用的案例,是混合了基本與進階的狀況。基本狀況預計常用 Restore、Retry,當無法滿足時再用 HandleFail 進階處理。而 Ignore 也算常使用,像 社交網站應用中像「按讚」這類不是很重要的訊息就可以忽視。OnEnterLeave 大多用來 做 UI 的介面管制,如:滑鼠、按鈕的管制,在按下按鈕後運算期間讓按鈕失能以免重 複下達多餘的指令產出不必要的意外。

圖 3.16 AspectW 用在 Catch-And-Retry 機制的指令下法

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

(二) 基本重試 Basic Retry

依據文獻探討來推論,圖 3.17 應是頻率最高的使用情境,有時應該連 Restore 都 不需要。我們觀察到有些情境:在網際網路上有些錯誤的應對方式是只要單純的稍停一 小段時間再重新執行出錯的指令甚至連復原動作都不必做。圖 3.17 描述的狀況就是如 此,若不需要 Restore 只要把它移除即可。

在此程式碼範例內容表示,當執行主功能邏輯“bar.DoSomeChange()”出現故障時 立刻回復狀態,然後稍停3秒再重試,重試的上限次數2次。

(三) 多重例外故障,Multiple Exception

多重的故障、例外也是常見的狀況。圖 3.18 多重例外處理,其關鍵點是透過泛型 機制在指令 Retry 指定針對要處理的例外故障。Retry 可以連續下達多次。Restore 也

圖 3.17 基本應用

圖 3.18 多重例外狀況處理

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

支援多個想保護的狀態物件。要注意 Restore 參數的下法,它是一個 RestoreWhenFail 陣列的結構。

(四) 參數化重試,Parameterized Retry

有時候也許換個參數再執行也通,比如傳送一些簡短的聊天訊息或通知短訊。也許 一開始用比較嚴謹的協定像是“HTTPS”,但有些特殊的關卡過不了。也許改用較不嚴謹 的協定像是“HTTP”就會過關了。若還不行或許改用替代方案用簡訊“SMS”做最後的備用方 案。如果連簡訊還失敗就忽略此錯誤吧。

(五) 發射導彈(firing a missile)

有些網際網路的指令就像是發設導彈一樣是無法收回的,這時候只能靠像“愛國者 飛彈”的設計一樣,再送出另一個取消指令請求廢除或無效化剛發出的指令。

圖 3.19 Parameterized Retry & Ignore

圖 3.20 發射導彈(firing a missile)

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

如圖 3.20 發射導彈就是一個這樣的案例。主功能邏輯產出一些訊息存並更新所屬 狀態物件“bar3” 隨後再由 FooFireUpdateMissile 送出到目的地伺服器,可過程出錯 了,這時就需要再用另一個指令 FooFireCancelMissile 去請求目的地伺服器廢除或無 效化剛剛送出的更新指令。可像這類的“導彈型”指令都必需特別設計 undo 機制才行。

它並不是想要就有的。