受檢異常 (checked exception) 會強迫 API 調用者一定要處理它,不論是用 try-catch 接住或是再往外傳遞皆可,過度的使用會讓調用者感到負擔。在正常使用該 API 時,無法阻止異常的產生,且一旦發生異常,調用者有能力去處理。若上述的條件成立,那麼丟出受檢異常就是合理的。
try {
...
} catch (SomeCheckedException e) {
System.out.exit(1);
}
如果調用者對於收到受檢異常無法處理 (如上),採用終止程式的策略,那不如單純丟出運行時異常。當產生越來越多的受檢異常時,對 API 調用者來說是件麻煩事,應盡量減少這類情況。應先考慮該受檢異常是否需要丟出去,再來考慮是否要將受檢異常改為運行時異常 (runtime exception) 來取代。或是像之前提到的,提供一狀態測試方法,讓調用者知道該如何處理,但如果物件在多執行緒下,會被外部改變狀態,那就不適合。像是 actionPermitted 和 action 中間有機會被改變狀態,或是 actionPermitted 方法必須重複 action 方法。if (obj.actionPermitted(args)) {
obj.action(args);
} else {
...
}
轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2021/03/effective-java-71-checked-exception.html
沒有留言:
張貼留言