2017-02-08 3 views
2

J'essaie d'utiliser le Google Guava Cache pour mettre en cache par des objets liés au service. En cache miss, j'utilise mon client REST pour récupérer l'objet. Je sais que je peux le faire de la manière suivante:Guava CacheLoader jeter et attraper des exceptions personnalisées

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) 

Maintenant, client.getKey(Key k) lancers francs et fait InternalServerExceptionResourceNotFoundException. Lorsque je tente d'utiliser cette instance de cache pour obtenir l'objet, je peux attraper l'exception en tant que ExecutionException.

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

} 

Mais, je voudrais attirer spécifiquement et gérer les exceptions que le CacheLoader que je l'ai défini est de lancer (i.e.. InternalServerException et ResourceNotFoundException).

Je ne suis pas sûr de vérifier si l'instance de ExecutionException est l'un de mes propres exceptions fonctionnerait soit, provoquer la signature de la méthode load() lance effectivement Exception et non ExecutionException. Même si je pouvais utiliser instanceof, cela ne semble pas très propre. Y a-t-il de bonnes façons d'aborder cela?

Répondre

2

De javadocs:

ExecutionException - si une exception contrôlée a été lancée lors du chargement la valeur. (ExecutionException est jeté, même si le calcul a été interrompue par un InterruptedException.)

UncheckedExecutionException - si une exception non contrôlée a été lancée lors du chargement de la valeur

Vous devez vérifier la cause de ExecutionException pris en appelant getCause() :

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