l

2013年5月17日 星期五

Clean Code之錯誤處理(2)

May 14 22:08~22:52

image

 

在《Clean Code之錯誤處理》Teddy提到書中介紹的八種例外處理技巧,並且分析了第2點「在開頭寫下try-catch-finally敘述」的可能問題。今天要談一下第4點與第5點:「提供例外發生相關資訊」和「從呼叫者角度定義例外類別」。

***

從呼叫者角度定義例外類別

接下來以《讀Clean Code有感:例外處理程式重構篇》裡面的程式碼當作範例,fetchRawBytesAndSetupMessageV5()這個method會丟出一個InvalidPacketException而不是直接丟出IOException。因為fetchRawBytesAndSetupMessageV5() 是第一個接觸到錯誤的method,只有它最清楚錯誤發生的可能原因。如果只是直接把IOException往外丟,呼叫者並不知到這個IOException代表什麼涵義。如果都沒人處理例外,最後這個 IOException傳到使用者介面層(或是被寫到 log),則更難分析錯誤原因。

從呼叫者的角度來看,如果fetchRawBytesAndSetupMessageV5()無法完成它所被賦予的任務,則表示無法成功讀取資料封包,因此fetchRawBytesAndSetupMessageV5() 丟出一個InvalidPacketException來代表這樣的錯誤意義。

image

***

提供例外發生相關資訊

繼續沿用上面這段程式碼,當InvalidPacketException的實例被產生的時候(90、101、103行),並不是直接丟出一個空的InvalidPacketException,而是會將「Read data length error」、「Data underflow」、「Read data body error」以及原始的錯誤物件等例外發生相關資訊一併回傳給呼叫者,以方便呼叫者作為例外處理的決策判斷資訊。

***

「啊,什麼,沒了,就這樣沒了?」沒錯,這兩個例外處理原則就這麼簡單。可見Teddy舉的這個例子有多麼的好,除了可以用來解釋「例外處理程式重構」,還可以說明「提供例外發生相關資訊」和「從呼叫者角度定義例外類別」,真是一箭三鵰啊很棒

***

友藏內心獨白:一例抵千言。

沒有留言:

張貼留言