在較高層的 API 應該要對其底下所丟出的異常,作出 catch 並同時拋出可以按照高層解釋的異常,這種作法稱作異常轉譯 (exception translation)。
try {
...
} catch (LowerLevelException e){
throw new HigherLevelException(...);
}
如果底層方法所丟出的異常,對於高層來說相當重要,那就應該保持其異常鍊 (exception chaining),將 catch 到的異常由高層轉譯後丟出,像是 throw new HighLevelException(e),e 為底下拋上來的異常,將 e 完整的放到高層異常的好處是它有全部的 stack trace 軌跡,調用者收到高層異常後,只需要用 getCause 方法,就可以拿到轉譯前的異常。try {
...
} catch (LowerLevelException e){
throw new HigherLevelException(e);
}
public class HigherLevelException {
HigherLevelException(Throwable cause) {
super(cause);
}
}
另外高層的方法盡量避免將底下丟出的異常直接丟出,應解析並作出處理,如果是由使用者行為造成,那麼應由高層方法丟出帶有分析後錯誤訊息的異常,如果不是高層方法能處理的,就將該異常鍊丟出,傳達給調用者。雖然異常轉譯是一種作法,但如果隨意使用,反而會造成異常鍊消失,不容易除錯,這時可以用 log 來作輔助記錄。
原文網址 https://cookieandcoketw.blogspot.com/2021/03/effective-java-73-exception-translation.html
沒有留言:
張貼留言