Как я могу игнорировать исключение? - PullRequest
30 голосов
/ 18 октября 2010

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

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

Ответы [ 4 ]

36 голосов
/ 18 октября 2010
scala.util.control.Exception.ignoring(classOf[ExceptionType]) {
  ... // Some throwing code
}
16 голосов
/ 18 октября 2010

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

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

4 голосов
/ 18 октября 2010

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

try {
  ... // Some throwing code
} catch {
  case e:ExceptionType => 
}
1 голос
/ 06 апреля 2017

Как насчет:

Try { 
     // some throwing code 
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...