使用 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
无效?我看到的所有示例和文章都只做 NumberFormatException
或 ArithmenticException
。并且大于和小于 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
我有一个关于 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
无效?我看到的所有示例和文章都只做 NumberFormatException
或 ArithmenticException
。并且大于和小于 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