首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Guava缓存和保留检查的异常

Guava缓存和保留检查的异常
EN

Stack Overflow用户
提问于 2011-12-27 22:54:02
回答 2查看 8.3K关注 0票数 23

我正在重构一些代码以使用guava Cache

初始代码:

代码语言:javascript
复制
public Post getPost(Integer key) throws SQLException, IOException {
    return PostsDB.findPostByID(key);
}

为了不破坏某些东西,我需要保留任何抛出的异常,而不是包装它。

当前的解决方案看起来有些丑陋:

代码语言:javascript
复制
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);
        }
    }
}

有没有可能让它变得更好?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-27 23:00:29

就在写完这个问题之后,我开始思考泛型驱动的实用方法。然后想起了一些关于Throwables的事情。是的,它已经在那里了!)

可能还需要处理UncheckedExecutionException or even ExecutionError

因此,解决方案是:

代码语言:javascript
复制
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.getUncheckedWhy we deprecated Throwables.propagate

票数 38
EN

Stack Overflow用户

发布于 2021-05-25 18:50:15

只需使用龙目岛的@SneakyThrows即可。强制异常包装不再有问题。

现在是2021年,Java仍然有检查过的异常...人们什么时候会明白,即使检查过的异常在理论上看起来很好,但它们在实践中制造了太多的问题?

长期解决方案:如果有机会,可以使用一种合适的语言,比如Kotlin。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8645965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档