Як ловити відразу кілька винятків у Scala? Чи є кращий спосіб, ніж у C #: Ловити кілька винятків одночасно?
Як ловити відразу кілька винятків у Scala? Чи є кращий спосіб, ніж у C #: Ловити кілька винятків одночасно?
Відповіді:
Ви можете прив'язати весь шаблон до такої змінної:
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, що називається Альтернативами шаблонів.
Годинники Pattern Matching розв'язали для більш глибокого занурення в зіставленні з зразком в Scala.
Оскільки ви маєте доступ до повноцінних можливостей збігу шаблонів 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")
}
Ви також можете використовувати 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")
}
Цей конкретний приклад може бути не найкращим прикладом, щоб проілюструвати, як ви можете ним користуватися, але я вважаю його досить корисним у багатьох випадках.
Це був єдиний шлях для мене, який пройшов через sbt clean coverage test coverageReport
не викидаючи неприємного винятку синтаксичного аналізу ...
try {
throw new CustomValidationException1(
CustomErrorCodeEnum.STUDIP_FAIL,
"could be throw new CustomValidationException2")
} catch {
case e
if (e.isInstanceOf[CustomValidationException1] || e
.isInstanceOf[CustomValidationException2]) => {
// run a common handling for the both custom exceptions
println(e.getMessage)
println(e.errorCode.toString) // an example of common behaviour
}
case e: Exception => {
println("Unknown error occurred while reading files!!!")
println(e.getMessage)
// obs not errorCode available ...
}
}
// ...
class CustomValidationException1(val errorCode: CustomErrorCodeEnum, val message: String)
class CustomValidationException2(val errorCode: CustomErrorCodeEnum, val message: String)
sbt clean coverage test coverageReport
час написання ... github.com/scoverage/sbt-scoverage/issues/257