Как поймать несколько исключений сразу в Scala? Есть ли лучший способ, чем в С#: Захват нескольких исключений сразу?
Захват нескольких исключений сразу в Scala
Ответ 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")
}
Этот конкретный пример может быть не лучшим примером для иллюстрации того, как вы можете его использовать, но я нахожу его довольно полезным во многих случаях.