java - tipos - Caché de guayaba y conservación de excepciones marcadas
tipos errores java (1)
Estoy refacturando un código para usar Guava Cache .
Código inicial:
public Post getPost(Integer key) throws SQLException, IOException {
return PostsDB.findPostByID(key);
}
Para no romper algo, necesito preservar cualquier excepción lanzada como está, sin envolverlo.
La solución actual parece algo fea:
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);
}
}
}
¿Hay alguna manera posible de hacerlo más agradable?
Justo después de escribir la pregunta, se comenzó a pensar en el método de utilidad con genéricos. Luego recordó algo sobre Throwables . Y sí, ¡ya está allí! )
También puede ser necesario manejar UncheckedExecutionException o incluso ExecutionError .
Entonces la solución es:
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);
}
}
¡Muy agradable!
Ver también ThrowablesExplicado .