mardi 12 juillet 2016

How to determine if exception was caused by a specific other exception?

Elastic search throws RemoteTransportException that is caused by IndexAlreadyExists exception.

I would like to ignore this one case, but still make sure to catch any other exceptions that might occur.

To that end, I implemented a function to determine if an exception was caused by another exception:

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

which I call like so:

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

This, however gives warning:

abstract type T is unchecked since it is eliminated by erasure 
e.isInstanceOf[T] || (e.getCause != null  && exceptionCausedBy[T](e.getCause))
              ^

Which makes sense, because the type T is known at compile time and erased by the compiler.

Is it sufficient to add ClassTag like so?

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

My testing in IDEA Scratchfile seems to confirm this, but I would like to get some expert opinion.

Also if this is a totally stupid way of going about this, please don't hesitate to point it out :)





Aucun commentaire:

Enregistrer un commentaire