本文介绍 Scala 中的模式匹配与异常处理,这两部分内容放在一起的原因是 Scala 中的异常处理是利用模式匹配的思想!

Jupyter 中学习效果更加哦!传送门~

Scala 模式匹配

Scala 提供了强大的模式匹配机制,一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。

1
2
3
4
5
6
7
// 模式匹配实例
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
println(matchTest(3))
many

match 对应 Java 里的 switch,但是写在选择器表达式之后。即: 选择器 match {备选项}

match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的 case,剩下的case不会继续匹配。

1
2
3
4
5
6
7
8
9
10
11
//不同数据类型的模式匹配
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
println(matchTest(6))
2
many
one
scala.Int

使用样例类

使用了case 关键字的类定义就是就是样例类(case classes),样例类是种特殊的类,经过优化以用于模式匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 实例

// 样例类
case class Person(name: String, age: Int)

val alice = new Person("Alice", 25)
val bob = new Person("Bob", 32)
val charlie = new Person("Charlie", 32)


for (person <- List(alice, bob, charlie)) {
person match {
case Person("Alice", 25) => println("Hi Alice!")
case Person("Bob", 32) => println("Hi Bob!")
case Person(name, age) =>
println("Age: " + age + " year, name: " + name + "?")
}
}
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?

Scala 异常处理

Scala 的异常处理和其它语言比如 Java 类似。

Scala 的方法可以通过抛出异常的方法的方式来终止相关代码的运行,不必通过返回值。

抛出异常

Scala 抛出异常的方法和 Java一样,使用 throw 方法,例如,抛出一个新的参数异常:

1
throw new IllegalArgumentException

捕获异常

异常捕捉的机制与其他语言中一样,如果有异常发生,catch 字句是按次序捕捉的。因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后。 如果抛出的异常不在catch字句中,该异常则无法处理,会被升级到调用者处。

捕捉异常的 catch 子句,语法与其他语言中不太一样。在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch的代码里,是一系列case字句,

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
try {
val f = new FileReader("none-input.txt")
} catch {
case ex: FileNotFoundException =>{
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
}
Missing file exception

finally 语句

finally 语句用于执行不管是正常处理还是有异常发生时都需要执行的步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
try {
val f = new FileReader("none-input.txt")
} catch {
case ex: FileNotFoundException =>{
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
} finally{
println("Exiting finally...")
}
Missing file exception
Exiting finally...

联系作者