23

guavaCacheを使用するようにいくつかのコードをリファクタリングしています。

初期コード:

public Post getPost(Integer key) throws SQLException, IOException {
    return PostsDB.findPostByID(key);
}

何かを壊さないために、スローされた例外をラップせずにそのまま保持する必要があります。

現在の解決策はやや醜いようです:

public Post getPost(final Integer key) throws SQLException, IOException {
    try {
        return cache.get(key, new Callable<Post>() {
            @Override
            public Post call() throws Exception {
                return PostsDB.findPostByID(key);
            }
        });
    } catch (ExecutionException e) {
        Throwable cause = e.getCause();
        if (cause instanceof SQLException) {
            throw (SQLException) cause;
        } else if (cause instanceof IOException) {
            throw (IOException) cause;
        } else if (cause instanceof RuntimeException) {
            throw (RuntimeException) cause;
        } else if (cause instanceof Error) {
            throw (Error) cause;
        } else {
            throw new IllegalStateException(e);
        }
    }
}

それをより良くするための可能な方法はありますか?

4

2 に答える 2

38

質問を書いた直後に、ジェネリックスを利用したユーティリティメソッドについて考え始めました。次に、 Throwablesについて何かを思い出しました。そして、はい、それはすでにそこにあります!)。

UncheckedExecutionExceptionまたはExecutionErrorを処理する必要がある場合もあります。

したがって、解決策は次のとおりです。

public Post getPost(final Integer key) throws SQLException, IOException {
    try {
        return cache.get(key, new Callable<Post>() {
            @Override
            public Post call() throws Exception {
                return PostsDB.findPostByID(key);
            }
        });
    } catch (ExecutionException e) {
        Throwables.propagateIfPossible(
            e.getCause(), SQLException.class, IOException.class);
        throw new IllegalStateException(e);
    } catch (UncheckedExecutionException e) {
        Throwables.throwIfUnchecked(e.getCause());
        throw new IllegalStateException(e);
    }
}

非常に素晴らしい!

ThrowablesExplainedLoadingCache.getUnchecked、およびThrowables.propagateを非推奨にした理由も参照してください。

于 2011-12-27T15:00:28.563 に答える
0

@SneakyThrowsロンボクから使用するだけです。強制的な例外ラッピングでもう問題はありません。

<rant> 2021年であり、Javaはまだ例外をチェックしています...チェックされた例外が紙の上で見栄えがよいとしても、実際にはあまりにも多くの問題を引き起こすことがいつ人々にわかりますか?

長期的な解決策:機会があれば、Kotlinなどの適切な言語に移行してください。</ rant>

于 2021-05-25T10:50:14.720 に答える