当我们捕获异常时,如何处理返回类型?有什么最佳做法吗?
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}
}
}
}
它们都正确吗?哪个是处理这些情况的更好方法?
答案 0 :(得分:3)
第二个错误,但由于与“在捕获异常时处理返回类型”无关。
使用Try
并立即匹配答案毫无意义;它只是try-catch
的详细版本和较慢版本。 Try
在您要将其传递到某个地方,或者可能合并多个计算时非常有用。
即使忽略了,正确的匹配还是
answer match {
case Success(x) => Map(divisor -> x)
case Failure(x) => { x.printStackTrace(); emptymap}
}
(如果您要在两种情况下都这样做,则无需分别处理ArithmeticException
和NumberFormatException
)。
两个版本都适用:
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))