Есть ли более элегантный способ написать следующее?
try {
... // Some throwing code
return first
}
catch {
case e:ExceptionType => {} // No code to execute. Ignore error.
}
return second
Есть ли более элегантный способ написать следующее?
try {
... // Some throwing code
return first
}
catch {
case e:ExceptionType => {} // No code to execute. Ignore error.
}
return second
scala.util.control.Exception.ignoring(classOf[ExceptionType]) {
... // Some throwing code
}
@Даниэль уже предоставил канонический метод для этого. Просмотрите другие методы в 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
Или вы можете вдохновиться этим, а также библиотечными процедурами и создать свои собственные методы, чтобы игнорировать несколько разных исключений и сохранять типы возвращаемого значения.
В Scala все исключения не проверяются, поэтому, если вы этого не хотите, вы можете просто пропустить их обработку (и, таким образом, исключение будет увеличено до более высокого уровня). Молча игнорируя исключение, как вы хотите сделать, как правило, это плохая практика. Однако ваш код можно сократить до:
try {
... // Some throwing code
} catch {
case e:ExceptionType =>
}
Описание:
Try {
// some throwing code
}
Это будет игнорировать все нефатальные исключения, которые вы хотите делать большую часть времени.
На кластере 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.