Scala 2.9';让我们试着…抓住你?

Scala 2.9';让我们试着…抓住你?,scala,Scala,我已经阅读了Scala 2.9的try…catch特性并进行了试验,它让我思考了各种可能性。除了保存几行代码之外,我还能用它做什么呢 用例能够在整个应用程序中进行通用错误处理。假设您希望通过向管理员发送电子邮件来处理应用程序中的所有FileNotFoundExceptions。以前,您必须这样做: // Globally val fileNotFound: PartialFunction[Throwable, Unit] = { case e: FileNotFoundException =

我已经阅读了Scala 2.9的try…catch特性并进行了试验,它让我思考了各种可能性。除了保存几行代码之外,我还能用它做什么呢


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

// 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)
}
现在你只要做:

try {
  // Open file
} catch fileNotFound
这还有一个很好的优点,即您可以在部分函数上使用
orElse
方法链接多个这样的异常处理程序:

val fileErrors = fileNotFound orElse endOfFile orElse invalidFormat
然后,只要在需要文件异常处理的地方使用它就行了。例如,可以根据应用程序的配置文件动态组合这样的错误处理程序。这比到处进行模式匹配并调用正确的处理程序要简单得多

可以在部分函数之上添加的一个有用的东西是
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)
  }
}
然后你可以这样做:

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.

我想你可以进一步研究
的确切语义和含义(以及名称),这是一个很好的答案,但我认为引入它的真正原因是其他原因。
try
/
catch
/
最后
处理引入了一个特殊情况。您使用了分部函数文字,但实际上无法用分部函数替换它。现在,
catch
只接收一个部分函数,该语言中的另一个特殊情况消失了。

我不确定是否会使用它。。。。但您可以使用任何(一致性)部分函数。。。在其他地方有统一的错误处理吗?(比如说
忽略这些sillyclosableexceptions
)除此之外,“Scala可以这样表达它很酷;-)灵感来源:保罗·菲利普斯(Paul Phillips)在实施这一点时提供了一个激励性的例子:如果有一个例子或至少有一个链接,问题会更好。@ziggystar在补丁说明中添加了一个链接。简洁的回答-我认为andAlso部分是我遗漏的部分。这实际上证实了我最初的推理-这主要是一个“整洁”一致同意-这是最好的一致性原则-一个具有可用性的广义结构。