2021/04/12

[筆記] Effective Java #73 拋出與抽象對應的異常

Effective Java 3rd 簡體中文版筆記 #73 拋出與抽象對應的異常
在較高層的 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

沒有留言:

張貼留言