在Scala中捕获异常期间处理返回类型的最佳方法

时间:2019-06-26 05:59:49

标签: scala

当我们捕获异常时,如何处理返回类型?有什么最佳做法吗?

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 个答案:

答案 0 :(得分:3)

第二个错误,但由于与“在捕获异常时处理返回类型”无关。

  1. 使用Try并立即匹配答案毫无意义;它只是try-catch的详细版本和较慢版本。 Try在您要将其传递到某个地方,或者可能合并多个计算时非常有用。

  2. 即使忽略了,正确的匹配还是

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

    (如果您要在两种情况下都这样做,则无需分别处理ArithmeticExceptionNumberFormatException)。

两个版本都适用:

  1. 即使未引发异常,您也要提前创建emptymap

答案 1 :(得分:1)

这两种方法均有效。这是第三个选项。

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))