Подтвердить что ты не робот

Захват нескольких исключений сразу в Scala

Как поймать несколько исключений сразу в Scala? Есть ли лучший способ, чем в С#: Захват нескольких исключений сразу?

4b9b3361

Ответ 1

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

try {
   throw new java.io.IOException("no such file")
} catch {
   // prints out "java.io.IOException: no such file"
   case e @ (_ : RuntimeException | _ : java.io.IOException) => println(e)
}

См. Scala Спецификация языка стр. 118, пункт 8.1.11, которые называются альтернативами шаблонов.

Ответ 2

Поскольку у вас есть доступ к полным возможностям сопоставления шаблонов scala в предложении catch, вы можете сделать много:

try {
  throw new IOException("no such file")
} catch {
  case _ : SQLException | _ : IOException => println("Resource failure")
  case e => println("Other failure");
}

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

def onFilesAndDb(code: => Unit) { 
  try { 
    code 
  } catch {
    your handling code 
  }
}

Некоторые такие методы доступны в объекте scala.util.control.Exceptions. failing, failAsValue, обработка может быть именно тем, что вам нужно

Изменить: вопреки сказанному ниже, альтернативные шаблоны могут быть связаны, поэтому предлагаемое решение излишне сложно. См. Решение @agilesteel

К сожалению, с этим решением у вас нет доступа к исключению, где вы используете альтернативные шаблоны. Насколько мне известно, вы не можете привязываться к альтернативному шаблону с флагом e @ (_ : SqlException | _ : IOException). Поэтому, если вам нужен доступ к исключению, вам нужно вложить сокеты:

try {
  throw new RuntimeException("be careful")
} catch  {
  case e : RuntimeException => e match {
    case _ : NullPointerException | _ : IllegalArgumentException => 
      println("Basic exception " + e)
    case a: IndexOutOfBoundsException => 
      println("Arrray access " + a)
    case _ => println("Less common exception " + e)
  }
  case _ => println("Not a runtime exception")
}

Ответ 3

Вы также можете использовать scala.util.control.Exception:

import scala.util.control.Exception._
import java.io.IOException

handling(classOf[RuntimeException], classOf[IOException]) by println apply { 
  throw new IOException("foo") 
}

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