Guava CacheLoader抛出并捕获自定义异常

时间:2017-02-08 09:08:57

标签: java guava google-guava-cache

我正在尝试使用Google Guava缓存按服务相关对象进行缓存。在缓存未命中时,我使用我的REST客户端来获取对象。我知道我可以通过以下方式做到这一点:

CacheLoader<Key, Graph> loader = new CacheLoader<Key, Graph>() {
     public Graph load(Key key) throws InternalServerException, ResourceNotFoundException {
       return client.get(key);
     }
   };
   LoadingCache<Key, Graph> cache = CacheBuilder.newBuilder().build(loader)

现在,client.getKey(Key k)实际上会引发InternalServerExceptionResourceNotFoundException。当我尝试使用此缓存实例来获取对象时,我可以将异常捕获为ExecutionException

try {
  cache.get(key);
} catch (ExecutionException e){

}

但是,我想特别捕捉并处理我定义的CacheLoader抛出的异常(即InternalServerExceptionResourceNotFoundException)。

我不确定是否检查ExecutionException的实例是否是我自己的异常之一也会有效,因为load()方法的签名实际上抛出Exception而不是{{1} }。即使我可以使用ExecutionException,它似乎也不是很干净。有没有什么好的appraoches来解决这个问题?

1 个答案:

答案 0 :(得分:3)

来自javadocs

  

ExecutionException - 如果在加载时抛出了已检查的异常   价值。 (即使计算是,抛出ExecutionException   被InterruptedException中断。)

     

UncheckedExecutionException - 如果在加载值

时抛出了未经检查的异常

您需要通过调用getCause()来检查捕获的ExecutionException的原因:

} catch (ExecutionException e){
    if(e.getCause() instanceof InternalServerException) {
        //handle internal server error
    } else if(e.getCause() instanceof ResourceNotFoundException) {
        //handle resource not found
    }
}