Проблема исключения утечки - PullRequest
0 голосов
/ 04 мая 2018

У меня есть сомнения относительно утечки исключений.

 case class CustomException(message: String) extends RuntimeException(message)

   def listOfFut(list: List[Int]): Future[List[Int]] = {
          def handleFut(list: List[Int]): Future[List[Int]] = {
            if (list.isEmpty) throw CustomException("Test")
            else Future.successful(list)
          }
          for {
            myList <- Future.successful(list)
            result <- handleFut(myList)
          } yield result
        }

Я сделал то же самое, что и приведенный выше фрагмент кода, но получил отзыв, что исключение исключения может произойти без упаковки. По сути, throw CustomException("Test") может вытекать исключение.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Ответ на it might leak the exception without wrapping it обрабатывает исключение, а не выбрасывает его. Вы должны потерпеть неудачу в будущем:

def handleFut(list: List[Int]): Future[Either[Exception,List[Int]]] = {
    if (list.isEmpty) Future.failed(new CustomException("Test"))
    else Future.successful(Right(list))
}
0 голосов
/ 04 мая 2018

Прежде всего, я не вижу ни одного случая утечки исключений, так как если список пуст, он ненормально завершится с пользовательским исключением. Один из подходов, который вы могли бы использовать, заключается в том, чтобы использовать Either для переноса исключения в Left и правильного вывода в Right.

Но это будет включать изменение сигнатуры метода

def listOfFut(list: List[Int]): Future[Either[Exception,List[Int]]] = {

  def handleFut(list: List[Int]): Future[Either[Exception,List[Int]]] = {
    if (list.isEmpty) Future.successful(Left(CustomException("Test")))
    else Future.successful(Right(list))
  }

  for {
    myList <- Future.successful(list)
    result <- handleFut(myList)
  } yield result
}

listOfFut(List()) onComplete {
  case Success(value) => println(s"Got the callback, meaning = $value")
    value match {
      case Right(output) =>
        println(s"Output is ${output}")
      case Left(ex) =>
        println(s"Exception is ${ex}")
    }
  case Failure(e) => e.printStackTrace
}

Пожалуйста, дайте мне знать, если это ответит на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...