Лучший способ обработки возвращаемых типов во время отлова исключений в Scala - PullRequest
0 голосов
/ 26 июня 2019

Как вы обрабатываете возвращаемые типы, когда мы отлавливаем исключения? Есть ли лучшие практики?

class Test {

  val emptymap = Map[Int,Int]()
  val divisor = 100
  def handleInt ( i : Int) : Map[Int, Int] = {
    try {

      val output = divisor / i
      Map(divisor -> output)
    } catch {
      case e : ArithmeticException => e.printStackTrace(); emptymap
      case e : NumberFormatException => e.printStackTrace(); emptymap
    }
  }

  def handleIntTry ( i : Int) : Map[Int, Int] = {
    val answer = Try(divisor / i)
    answer match {
      case x : Success[Int] => Map(divisor -> answer.get)
      case x : ArithmeticException => { x.printStackTrace(); emptymap}
      case x : NumberFormatException => { x.printStackTrace(); emptymap}
    }
  }
}

Они оба правы? Какой способ лучше всего справиться с этими ситуациями?

Ответы [ 2 ]

3 голосов
/ 26 июня 2019

Второе неверно, но по причинам, которые не имеют ничего общего с «обработкой типов возврата, когда мы отлавливаем исключения».

  1. Бессмысленно использовать Try, а затем сразу сопоставлятьна ответ;это просто более подробная и медленная версия try-catch.Try полезно, когда вы собираетесь его где-то передать или, возможно, объединить несколько вычислений.

  2. Даже если пренебречь этим, правильное совпадение будет

    answer match {
      case Success(x) => Map(divisor -> x)
      case Failure(x) => { x.printStackTrace(); emptymap}
    }
    

    (не нужно обрабатывать ArithmeticException и NumberFormatException отдельно, если вы собираетесь сделать то же самое в обоих случаях).

Что относится к обеим версиям:

вы создаете emptymap заранее, даже если исключение не выдается.
1 голос
/ 26 июня 2019

В любом случае работает. Вот третий вариант.

def handleInt(i :Int) :Map[Int,Int] =
  Try(divisor / i).fold({
    case x : ArithmeticException   => x.printStackTrace(); emptymap
    case x : NumberFormatException => x.printStackTrace(); emptymap
  }, answer => Map(divisor -> answer))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...