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

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

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

Ответы

Ответ 1

scala.util.control.Exception.ignoring(classOf[ExceptionType]) {
  ... // Some throwing code
}

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

Описание:

Try { 
     // some throwing code 
}

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

Ответ 5

На кластере Azure с 5,4 ML (Scala 2.11) сработало следующее

object Monkey extends Exception {}

try {
// code that throws
  if(banana) throw Monkey
} catch {
  case Monkey => {}
}

Что работает, может зависеть от версии Scala. Все это должно было обойти отсутствие break в цикле Scala на кирпичах данных Azure.