@ Даниэль уже предоставил канонический метод для этого. Посмотрите другие методы в 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
Или вы можете быть вдохновлены этим плюс библиотечными процедурами и создавать свои собственные методы, чтобы игнорировать множество различных исключений и сохранять типы в возвращаемом значении.