2011-12-27 2 views
18

Я пересматриваю код для использования guava Cache.Ключ Guava и сохранение отмеченных исключений

Начальный код:

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); 
     } 
    } 
} 

Есть ли возможный способ сделать его лучше?

ответ

31

Сразу после написания вопроса началось размышление об использовании метода полезности с использованием дженериков. Тогда что-то вспомнилось о Throwables. И да, это уже есть!)

Может также понадобиться для обработки UncheckedExecutionException or even 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.

+0

Hesitated, если вопрос, ответ на который должен быть отправлен, должен быть опубликован вообще. Но это дало понять: http://meta.stackexchange.com/questions/2706/posting-and-answering-questions-you-have-already-found-the-answer-to – Vadzim

+1

И спасибо, гуава! – Vadzim

+0

Итак, отметьте это ** ** действительный ответ;) – Xaerxess