使用 try-catch 表达式匹配非异常值的模式

Pattern matching a non-exceptional value using try-catch expression

我有一个关于 try catch 块的问题。这是一个例子:

val num = try {
  110 / 12
} catch {
  case ex: NumberFormatException => 0
}

val num1 = try {
  110 / 13
} catch {
  case a: num1 > 10 => 10
  case b: num1 < 10 => 12
}

我知道 num 有效,为什么 num1 无效?我看到的所有示例和文章都只做 NumberFormatExceptionArithmenticException。并且大于和小于 case 语句中的无效运算符?是否可以使用模式匹配将 try catch 块视为 if else 块?

我猜你想写类似

的东西
try {
  110 / 13
} catch {
  case a if a > 10 => 10
  case b if b < 10 => 12
}

但是这不是有效的语法,因为 try 表达式属于 form

try { b } catch h

其中处理程序 h 必须是类型

的部分函数
PartialFunction[Throwable, T]

所以 case a if a > 10 中的 a 必须是 Throwable 但是 Throwable 没有定义 > 方法。


考虑使用 Try 而不是 try-catch 表达式来处理单子错误。这将允许您简单地 map 在快乐的情况下结束。例如,考虑

Try(110 / 13)
  .map(num => if (num > 10) 10 else 12)
  .getOrElse(someDefaultValue)

Handling Error Without Exceptions 有一些互动练习可以让您开始了解这个概念。

补充另一个答案,如果你渴望有一个整洁的案例列表:

scala> import util._
import util._

scala> Try(1/0) match {
     | case Success(i) if i > 42            => 42
     | case ok @ Success(_)                 => ok
     | case Failure(_: ArithmeticException) => 27
     | }
res0: Int = 27