Scala 2.9的尝试有什么用例...抓住概括?

Set*_*eth 20 scala

我已经阅读并尝试了Scala 2.9 try ... catch功能,它让我思考可能性.除了保存几行代码之外,我还能用它做什么呢?

Scala 2.9最终版本说明

axe*_*l22 25

用例是能够在整个应用程序中进行一般错误处理.假设您希望FileNotFoundException通过向管理员发送电子邮件来处理应用程序中的所有内容.以前,你必须这样做:

// Globally
val fileNotFound: PartialFunction[Throwable, Unit] = {
  case e: FileNotFoundException =>
    // Create report and send the e-mail
}

// On each try-catch-block
try {
  // Open file
} 
catch {
  case fnf: FileNotFoundException => fileNotFound(fnf)
}
Run Code Online (Sandbox Code Playgroud)

现在你做:

try {
  // Open file
} catch fileNotFound
Run Code Online (Sandbox Code Playgroud)

这也有一个很好的优点,你可以使用orElse部分函数的方法链接几个这样的异常处理程序:

val fileErrors = fileNotFound orElse endOfFile orElse invalidFormat
Run Code Online (Sandbox Code Playgroud)

然后只需在需要文件异常处理的地方使用它.例如,可以基于应用程序的配置文件动态地组合这样的错误处理程序.这比在各处进行模式匹配并调用正确的处理程序要麻烦得多.

可以在部分函数之上进行andAlso操作的一个有用的东西是操作符,它充当两个部分函数的排序操作符.当您想在完成一般错误处理后执行特定于try-catch块的特定错误处理时,这将非常有用.

implicit def pf2ops(pf: PartialFunction[Throwable, Unit]) = new {
  def andAlso(localpf: PartialFunction[Throwable, Unit]) = new PartialFunction[Throwable, Unit] {
    def apply(t: Throwable) = {
      if (pf.isDefinedAt(t)) pf(t)
      localpf(t)
    }
    def isDefinedAt(t: Throwable) = pf.isDefinedAt(t) || localpf.isDefinedAt(t)
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

scala> try {
     |   throw new java.io.FileNotFoundException
     | } catch fnf andAlso {
     |   case e: Exception => println("I don't know, but something is specific to this particular block.")
     | }
I don't know, but something is specific to this particular block.
Run Code Online (Sandbox Code Playgroud)

我想你可以进一步发挥确切的语义和意义(和名称)andAlso.


Dan*_*ral 7

axel22的答案很好,但我认为引入它的真正原因是别的.在try/ catch/ finally处理引入了一个特殊的情况.您使用了部分函数文字,但实际上您无法用部分函数替换它.现在,catch只接收部分功能,语言中的另一个特殊情况就消失了.