2016-07-12 6 views
0

Elastic検索は、IndexAlreadyExists例外によって引き起こされるRemoteTransportExceptionをスローします。例外が特定の他の例外によって引き起こされたかどうかを判断する方法?

私はこの1つのケースを無視したいと思いますが、発生する可能性のある他の例外を確実にキャッチしてください。そのために

は、私は例外が別の例外によって引き起こされたかどうかを判断するための機能を実装:私はそうのように呼び出す

private def exceptionCausedBy[T](e: Throwable): Boolean = { 
    // scalastyle:off null 
    e.isInstanceOf[T] || (e.getCause != null && exceptionCausedBy[T](e.getCause)) 
    } 

... 
case e: Throwable if exceptionCausedBy[IndexAlreadyExistsException](e) => 
... 

これは、しかし、警告を与えます

これは、タイプTがコンパイル時にわかっていて、消去されているためですコンパイラによって。

ClassTagを追加するだけで十分ですか?

def exceptionCausedBy[T: ClassTag](e: Throwable): Boolean = { 
    // scalastyle:off null 
    e.isInstanceOf[T] || (e.getCause != null && exceptionCausedBy[T](e.getCause)) 
} 

IDEA Scratchfileでの私のテストはこれを確認しているようですが、私は専門家の意見を得たいと思います。

また、これはこれについて行くのは全く愚かな方法であれば、: Tが行うマッチング、

+0

少なくともそれは論理的に聞こえる:) – ipoteka

答えて

1

isInstanceOf[T]チェックがClassTagを使用していません:)それを指摘することを躊躇しないでください。だからそれはする必要があります

def exceptionCausedBy[T: ClassTag](e: Throwable): Boolean = e match { 
    // scalastyle:off null 
    case null => false 
    // scalastyle:on null 
    case _: T => true 
    case _ => exceptionCausedBy[T](e.getCause) 
} 
+0

偉大な、そのトリックを行うようです。 ':Classtag'の役割は正確に理解できますか? – mirosval

+0

「Scala context bound」を検索すると、多くの説明があります(特にSOと特に一般的にインターネット上にあります)。 –

関連する問題