2017-02-08 14 views
2

Google Guavaキャッシュを使用してサービス関連のオブジェクトをキャッシュしようとしています。キャッシュミスでは、オブジェクトをフェッチするためにRESTクライアントを使用します。私は、次の方法でこれを行うことができますことを知っている:Guava CacheLoaderがカスタム例外をスロー&キャッチ

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のインスタンスは、どちらかの作業負荷の署名を引き起こす私自身の例外の一つであるかどうかをチェックする場合

は、私はよく分からない()メソッドは、実際にExceptionないExecutionExceptionスローします。 instanceofを使用することができたとしても、それは非常にきれいに見えません。これに対処するための良いappraochesはありますか? javadocsから

答えて

2

ExecutionException - 値をロード中にチェック例外がスローされた場合。 (計算は 例外:InterruptedExceptionによって中断された場合でも、ExecutionExceptionがスローされます。)

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 
    } 
} 
関連する問題