l

2013年12月26日 星期四

例外處理實務做法(2下):Unhandled Exception、Unchecked Client Problem、Exception Wrapping、Safety Net

Dec. 23 18:15~19:10

-2013-12-23-11.28.22_thumb2

圖片來源在此

今天要介紹《Java Idioms: Exception Handling》這篇文章中剩下的四個pattern:Unhandled ExceptionUnchecked Client ProblemException WrappingSafety Net

***

Unhandled Exception

在實做函數功能的時候,你遇到了Checked Server Problem(也就是checked exception),但是此時你只想要實作正常邏輯,並不想要處理例外行為。這時候,不可以用一個空的catch block捕捉例外並忽略它,而是先定義一個屬於RuntimeException的UnhandledException,將Checked Server Problem串接在UnhandledException身上,然後丟出這個UnhandledException代表目前該例外還沒有被處理。

這個pattern的做法,和Teddy之前在〈敏捷式例外處理設計 (3):我到底哪裡做錯之 ignored checked exception〉文章中介紹過的「Replace Ignored Checked Exception with Unchecked Exception」這個例外處理重構方法所講的是一樣的原理。

***

Unchecked Client Problem

一個函數的執行需要依賴它的輸入參數,如果輸入參數錯誤,則函數的執行也會產生錯誤。在這種情況下,讓Throwing Server丟出一個RuntimeException的子類別,用來代表輸入參數錯誤的問題。在Java語言中,IllegalArgumentException、IllegalStateException都是這個pattern的例子。

Teddy在這裡要補充說明一下,這篇文章用Checked Server ProblemUnchecked Client Problem分別代表一種使用checked與unchecked exception的時機。但實際上checked與unchecked exception在Java語言裡面扮演的角色,Teddy認為應該從component fault與design fault的角度來來解釋,這樣子涵蓋面比較完整。請參考〈Fault、Error、Failure、Exception〉的說明。

***

Exception Wrapping

若一個函數宣告它會丟出Homogeneous Exception,則將原本發生的例外串接在Homogeneous Exception身上(把一個例外串接到另外一個例外裡面,這個動作叫做wrapping,打包的意思)。讓客戶端的程式捕捉到Homogeneous Exception的時候,可以透過被打包的例外物件,知道例外發生的根本原因。

事實上,Exception Wrapping是一種很常見的拋出例外技巧,像是Unhandled ExceptionTunneling Exception也都會套用這個技巧。

***

Safety Net

如果例外沒有被捕捉,最後會導致程式不預期的終止。因此,安裝一個預設的例外處理程序,把它當成一個安全網,用來捕捉Throwable例外。這個安全網可以安裝在application、thread、或是thread group身上。

這個pattern和Teddy之前介紹過的「Avoid unexpected termination with big outer try block」 這個 重構方法基本上是一樣的,請參考〈敏捷式例外處理設計 (6):我到底哪裡做錯之 unprotected main program〉。

 

***

分三次把《Java Idioms: Exception Handling》這篇文章所介紹的11個例外處理模式都介紹完畢,以Teddy自己的經驗,這11個模式所提出的建議,都是很實用的例外處理實務做法。雖然作者的出發點是以Java語言為目標,但很多模式也同樣使用於只支援unchecked exception的語言,例如C#)。像是Expressive Exception Interface、Homogeneous Exception、Exception Hierarchy、Smart Exception、Tunneling Exception、Safety Net這幾個pattern,使用C#或其他非Java語言的鄉民們可以驗證一下,是否也可以一體適用。

***

友藏內心獨白:一魚三吃。

沒有留言:

張貼留言