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

如何在Scala中返回None

发布时间:2020-12-16 18:43:59 所属栏目:安全 来源:网络整理
导读:对于我的第一个 Scala程序,我正在尝试编写一个小工具,它将XML文件从一个模式转换为另一个模式. 我开始编写一个方法,它将为我提供文件内容: def loadFile(filename: String,encoding: String = "utf-8"):Option[String] = { try { val source = scala.io.Sou
对于我的第一个 Scala程序,我正在尝试编写一个小工具,它将XML文件从一个模式转换为另一个模式.

我开始编写一个方法,它将为我提供文件内容:

def loadFile(filename: String,encoding: String = "utf-8"):Option[String] = {
    try
    {
      val source = scala.io.Source.fromFile(filename,encoding)
      val contents = source.mkString
      source.close()
      return Some(contents)
    }
    catch 
    {
      return None
    }

  }

但它没有编译.我回来了“值apply不是Nothing的成员”和“value isDefinedAt不是Nothing的成员”,因为该行的错误消息返回None.

我可以找到返回选项使用匹配的所有示例,但这在这里没有意义.如果由于某种原因我无法读取文件,我只想不失败.

在这种情况下我该怎么办?在Scala中有这种做事的模式吗?

解决方法

在这种特殊情况下(异常处理),我建议改用 Try.

def loadFile(filename: String,encoding: String = "utf-8"):Option[String] = {
    Try {
      val source = scala.io.Source.fromFile(filename,encoding)
      val contents = source.mkString
      source.close()
      return Some(contents)
    }.toOption
}

但是,我会建议不要删除异常.你通过返回None来吞下错误的原因:它是FileNotFoundException吗?标准的IOException?是否有错误消息(想到不受支持的编码…)?

我的经验法则是让调用者处理异常.如果他不关心错误本身,处理事情就像:

Try {loadFile("test.txt")}.toOption

更好的是,由于Try具有所有必需的方法,因此可以以相当简洁的方式用于理解:

for(s <- Try {loadFile("test.txt")};
    i <- Try {s.toInt}) yield i

这将导致Success [Int]或Failure包含一个描述确切错误的异常.

(编辑:李大同)

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

    推荐文章
      热点阅读