2011-12-27 32 views
18

Tôi đang tái cấu trúc một số mã để sử dụng guava Cache.Bộ nhớ cache ổi và lưu giữ các ngoại lệ đã kiểm tra

mã ban đầu:

public Post getPost(Integer key) throws SQLException, IOException { 
    return PostsDB.findPostByID(key); 
} 

Để không phá vỡ một cái gì đó tôi cần phải duy trì bất kỳ ngoại lệ ném như là, mà không cần gói nó.

giải pháp hiện tại dường như hơi xấu xí:

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

Có cách nào có thể làm cho nó đẹp hơn?

Trả lời

31

Chỉ sau khi viết câu hỏi bắt đầu suy nghĩ về phương pháp tiện ích được hỗ trợ với generics. Sau đó, hãy nhớ điều gì đó về Throwables. Và có, nó đã có!)

Cũng có thể cần thiết để xử lý UncheckedExecutionException or even ExecutionError.

Vì vậy, giải pháp là:

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

Very nice!

Xem thêm ThrowablesExplained.

+0

Ngừng nếu câu hỏi tự trả lời được đăng hoàn toàn. Nhưng điều này đã làm cho nó rõ ràng: http://meta.stackexchange.com/questions/2706/posting-and-answering-questions-you-have-already-found-the-answer-to – Vadzim

+1

Và cảm ơn bạn, những người ổi! – Vadzim

+0

Vì vậy hãy đánh dấu nó là ** câu trả lời hợp lệ **;) – Xaerxess

Các vấn đề liên quan