弹性搜索会抛出由IndexAlreadyExists异常引起的RemoteTransportException。
我想忽略这一个案例,但仍然要确保捕获可能发生的任何其他异常。
为此,我实现了一个函数来确定异常是否是由另一个异常引起的:
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) =>
...
然而,这会发出警告:
abstract type T is unchecked since it is eliminated by erasure
e.isInstanceOf[T] || (e.getCause != null && exceptionCausedBy[T](e.getCause))
^
这是有道理的,因为类型T在编译时是已知的并且由编译器擦除。
这样添加ClassT是否足够?
def exceptionCausedBy[T: ClassTag](e: Throwable): Boolean = {
// scalastyle:off null
e.isInstanceOf[T] || (e.getCause != null && exceptionCausedBy[T](e.getCause))
}
我在IDEA Scratchfile中的测试似乎证实了这一点,但我想得到一些专家意见。
此外,如果这是一个完全愚蠢的方式,请不要犹豫,指出:)
答案 0 :(得分:1)
isInstanceOf[T]
检查不使用ClassTag
,匹配: T
。所以它应该是
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)
}