Поскольку у вас есть доступ к полным возможностям сопоставления с образцом 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 .fails, 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")
}