サブメソッドが例外をスローすると、専用の "パッケージ"例外のカプセル化は良いとみなされますか?コンポーネントから例外をスローするのは良い方法ですか?
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レイヤです。データベースへの 'Collection'ビューを考えてみましょう。そこには、下位のストレージシステムの障害をラップする必要があります。 'IllegalStateException'や' NoSuchElementException'の中に入れてください。私は、これらがより良い例を作ると思う。 – Holger