todas tipos propias propagacion las excepciones errores arbol java caching exception-handling guava checked-exceptions

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 .