加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala 2.9的用例是什么?catch泛化?

发布时间:2020-12-16 09:39:23 所属栏目:安全 来源:网络整理
导读:我已经阅读并尝试了Scala 2.9 try … catch功能,它让我想到了可能性。除了保存几行代码之外,我实际使用什么? Scala 2.9 Final Release Notes 解决方法 用例是在整个应用程序中具有通用错误处理。假设您想通过向管理员发送电子邮件来处理应用程序中的所有F
我已经阅读并尝试了Scala 2.9 try … catch功能,它让我想到了可能性。除了保存几行代码之外,我实际使用什么?

Scala 2.9 Final Release Notes

解决方法

用例是在整个应用程序中具有通用错误处理。假设您想通过向管理员发送电子邮件来处理应用程序中的所有FileNotFoundExceptions。以前,你必须这样做:

// 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.

我想你可以进一步发挥其准确的语义和意义(和名称)和。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读