/ 城寒 / Scala - Exception & IO & Shell

Scala - Exception & IO & Shell

2018-01-27 posted in [Scala]

参考

异常

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