Scala - Exception & IO & Shell
异常
Scala 的异常处理和其它语言比如 Java 类似。方法可以通过抛出异常的方法的方式来终止相关代码的运行,不必通过返回值。 抛出异常使用 throw 方法,catch字句是按次序捕捉的。因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后。 如果抛出的异常不在catch字句中,该异常则无法处理,会被升级到调用者处。捕捉异常的catch子句,语法与其他语言中不太一样。在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch的代码里,是一系列case字句。 finally 语句用于执行不管是正常处理还是有异常发生时都需要执行的步骤
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
object Test {
def main(args: Array[String]) {
try {
// 抛出异常
// throw new IllegalArgumentException
val f = new FileReader("input.txt")
} catch {
case ex: FileNotFoundException => {
println("Missing file exception")
println(ex.toString)
ex.printStackTrace // 详细
}
case ex: IOException => {
println("IO Exception")
}
} finally {
println("Exiting finally...")
}
}
}
文件I/O
Scala 进行文件写操作,直接用的都是 java中 的 I/O 类 (java.io.File)
import java.io._
import scala.io.Source
object Test {
def main(args: Array[String]) {
// 在你的当前目录下生产一个 test.txt 文件
val writer = new PrintWriter(new File("test.txt" ))
writer.write("Hello")
writer.close()
// 接收用户在屏幕输入的指令
val line = Console.readLine
// 使用 Scala 的 Source 类及伴生对象来读取文件
Source.fromFile("test.txt" ).foreach{ print }
}
}
执行shell
import scala.sys.process._
import scala.language.postfixOps // 允许使用『!』将CMD命令外部执行
// 直接外部执行ls并返回结果,可怕
"ls".!
// 将输出封装为lineStream
val contents = Process("ls").lineStream
// 用Seq使得dir中包含空格也可以
def contentsOf(dir: String): String = Seq("ls", dir).!! ;
// 还可以重定向,甚至可以在对象与命令之间:
new URL("http://databinder.net/dispatch/About") #> "grep JSON" #>> new File("About_JSON") !
// 注意,重定向必须用 new java.io.File("") 封装,否则会当作命令,比如
"ls" #> "/tmp/a" ! // 错误
"ls" #> new java.io.File("/tmp/a") ! //正确
// 管道的用法:
// 不能在命令表达式中直接用管道, 比如 "ls | grep XXX" 这样不灵,必须用 #| 声明。
val list = "ls -l" #| "grep P" !
更多花式操作请参考: http://www.scala-lang.org/api/current/scala/sys/process/ProcessBuilder.html