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



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

704   4  

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

    Ничего не найдено.