Как я могу игнорировать исключение?

Есть ли более элегантный способ написать следующее?

try {
    ... // Some throwing code
    return first
} 
catch {
    case e:ExceptionType => {} // No code to execute. Ignore error.
}
return second

4 ответа

Решение
scala.util.control.Exception.ignoring(classOf[ExceptionType]) {
  ... // Some throwing code
}

@Daniel уже предоставил канонический метод для этого. Посмотрите другие методы в scala.util.control.Exception- они весьма полезны и универсальны!

Если вам нужно получить возвращаемое значение из блока try, используйте failing вместо ignoring (но учтите, что результатом является Anyто есть не небезопасно).

Вы также можете написать свой собственный обработчик исключений, который будет немного медленным для тяжелой работы, но в остальном приятно использовать:

class DefaultOn[E <: Exception] {
  def apply[A](default: => A)(f: => A)(implicit m: Manifest[E]) = {
    try { f } catch { case x if (m.erasure.isInstance(x)) => default }
  }
}
object DefaultOn { def apply[E <: Exception] = new DefaultOn[E] }

scala> DefaultOn[NumberFormatException](0) { "Hi".toInt }
res0: Int = 0

Или, если вам нравятся варианты:

class TryOption[E <: Exception] {
  def apply[A](f: => A)(implicit m: Manifest[E]) = {
    try { Some(f) } catch { case x if (m.erasure.isInstance(x)) => None }
  }
}
object TryOption { def apply[E <: Exception] = new TryOption[E] }

scala> TryOption[NumberFormatException] { "Hi".toInt }
res1: Option[Int] = None

Или вы можете быть вдохновлены этим плюс библиотечные процедуры и создавать свои собственные методы, чтобы игнорировать множество различных исключений и сохранять типы в возвращаемом значении.

В Scala все исключения не проверяются, поэтому, если вы не хотите, вы можете просто пропустить их обработку (и, таким образом, исключение будет повышено до более высокого уровня). Молчаливое игнорирование исключения так, как вы хотите, обычно является плохой практикой. Тем не менее, ваш код может быть сокращен до:

try {
  ... // Some throwing code
} catch {
  case e:ExceptionType => 
}

Как насчет:

Try { 
     // some throwing code 
}

Это будет игнорировать все не фатальные исключения, что вы и хотите делать большую часть времени.

Другие вопросы по тегам