當一個子方法拋出一個異常時,封裝在專用的「包」異常中會被認爲是不錯的實踐嗎?通過組件拋出異常,良好實踐?
public String doStuff() throws UtilsException {
try {
throw new NullPointerException("test");
} catch (NullPointerException e) {
throw new UtilsException("something occured", e);
}
}
//use this exception for all classes of this package/component
public class UtilsException extends Exception {
private static final long serialVersionUID = 1L;
public UtilsException() {
super();
}
public UtilsException(String message, Throwable cause) {
super(message, cause);
}
public UtilsException(String message) {
super(message);
}
public UtilsException(Throwable cause) {
super(cause);
}
}
可能Optional.empty()
是避免拋/複雜的應用程序的捕捉的方法嗎?
public Optional<String> doStuff() throws UtilsException {
try {
return Optional.of("ok");
} catch (NullPointerException e) {
LOG.error("Something append... {}", e.getMessage());
return Optional.empty();
}
}
在某些設置中將低級異常包裝爲高級異常可能是一種很好的做法,但是如果您正在討論'NullPointerException',則不是。你甚至不應該捕獲一個'NullPointerException'。它在你的所有應用程序中具有相同的含義。一個'Optional'封裝了一個可能缺少的值,而不是一個發生'NullPointerException'的報告。首先避免'NullPointerException'。你可以通過使用'Optional'來做到這一點。 – Holger
NullPointerException只是爲了解釋我的設置。遵循異常的來源,包裝看起來很有趣。 –
然後你選擇了一個非常糟糕的例子。考慮一下,一個'ClassNotFoundException'封裝了加載類字節時發生的IOException。特殊情況是API層不允許檢查異常,例如考慮數據庫的「集合」視圖。在那裏,底層存儲系統的故障必須被打包,例如,在'IllegalStateException's或'NoSuchElementException's中。我認爲,這些都是更好的例子。 – Holger