如何确定异常是否是由特定的其他异常引起的?

时间:2016-07-12 16:18:51

标签: scala exception reflection types exception-handling

弹性搜索会抛出由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中的测试似乎证实了这一点,但我想得到一些专家意见。

此外,如果这是一个完全愚蠢的方式,请不要犹豫,指出:)

1 个答案:

答案 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)
}