2017-02-08 5 views
2

Ich versuche, den Google Guava Cache zum Zwischenspeichern von Service-Objekten zu verwenden. Bei Cache-Fehltreffer verwende ich meinen REST-Client, um das Objekt abzurufen. Ich weiß, dass ich dies auf folgende Weise tun:Guava CacheLoader werfen und fangen benutzerdefinierte Ausnahmen

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) 

Nun client.getKey(Key k) eigentlich InternalServerException und ResourceNotFoundException wirft. Wenn ich versuche, diese Cache-Instanz zum Abrufen des Objekts zu verwenden, kann ich die Ausnahme als ExecutionException abfangen.

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

} 

Aber ich möchte ausdrücklich fangen und die Ausnahmen zu behandeln, die die Cacheloader I definiert wirft (d. InternalServerException und ResourceNotFoundException).

Ich bin nicht sicher, ob die Überprüfung, ob die Instanz von ExecutionException einen meiner eigenen Ausnahmen entweder funktionieren würde, bewirken, dass die Unterschrift der Last() Methode wirft tatsächlich Exception und nicht ExecutionException. Selbst wenn ich instanceof verwenden könnte, scheint es nicht sehr sauber. Gibt es irgendwelche guten Ansätze dafür?

Antwort

2

Von javadocs:

ExecutionException - wenn eine geprüfte Ausnahme geworfen wurde, während der Wert geladen werden. (ExecutionException geworfen wird, auch wenn die Berechnung durch eine InterruptedException unterbrochen wurde.)

UncheckedExecutionException - wenn eine ungeprüfte Ausnahme ausgelöst wurde, während der Wert Laden

Sie benötigen Ursache gefangen ExecutionException zu überprüfen, indem getCause() aufrufen :

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