Ответ 1
Сразу после написания вопроса начали задумываться о полезности метода с использованием дженериков. Потом вспомнил кое-что о 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);
}
}
Очень хорошо!
Смотрите также ThrowablesExplained, LoadingCache.getUnchecked и Почему мы устарели Throwables.propagate.