Перехват нескольких исключений сразу в Scala
Как поймать несколько исключений сразу в Scala? Есть ли лучший способ, чем в C#: поймать несколько исключений сразу?
4 ответов:
вы можете привязать весь шаблон к переменной, как это:
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 называется шаблон альтернативы.
посмотреть Сопоставление Шаблонов Развязано для более глубокого погружения в сопоставления с шаблоном в 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 } }некоторые такие методы доступны в object скала.утиль.управление.Исключения. failing, failAsValue, обработка может быть только то, что вам нужно
Edit: вопреки тому, что есть сказанное ниже, альтернативные модели могут быть связаны, поэтому предлагаемое решение является излишне сложным. Смотрите @ agilesteel solution
к сожалению, с этим решением, у вас нет доступа в случаях, когда вы используете альтернативные модели. Насколько мне известно, вы не можете привязать альтернативный шаблон с case
e @ (_ : SqlException | _ : IOException). Поэтому, если вам нужен доступ к исключению, вы должны вложить matchers: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)
Comments