返回 Unit 的函数的 Scala Option Some/None 习惯用法

IUn*_*own 3 error-handling scala exception-handling

我有许多函数对来操作资源,例如:

def loadFile(name: String): Option[String]
def writeFile(name: String, data: String): ???
Run Code Online (Sandbox Code Playgroud)

loadFile当前实现为使用 Option Some/None 返回结果字符串,但是writeFile呢?

loadFile一样,如果writeFile失败,我希望它返回一个包含在一个很好的 Try 或 Option 中的响应,而不是抛出异常或返回 null、Boolean 或响应代码。

有哪些推荐的最佳实践?

def writeFile(name: String, data: String): Try(Unit)
Run Code Online (Sandbox Code Playgroud)

或者

def writeFile(name: String, data: String): Option(Unit)
Run Code Online (Sandbox Code Playgroud)

并且只是测试成功标志?

解决这个问题的最佳 Scala-thonic 方法是什么?

Mic*_*jac 5

此处的其他答案与 几乎相同Try[Unit],但需要更多样板。这很简单(实际上是在函数定义中添加 3 个字母):

def writeFile(name: String, data: String): Try[Unit] = Try {
    // do write operation that may throw an exception
}
Run Code Online (Sandbox Code Playgroud)

的巨大优势Try在于它是一个 monad,因此您能够map并且flatMap(除其他外)Try轻松地将多个操作组合成一个操作。假设您需要一起执行其中 3 个操作,然后返回Unit或执行第一个Exception.

val result: Try[Unit] = for {
    a <- writeFile(name1, data1)
    b <- writeFile(name2, data2)
    c <- writeFile(name3, data3)
} yield ()
Run Code Online (Sandbox Code Playgroud)

您可以匹配结果:

result match {
    case Success(_) => println("Success!")
    case Failure(t) => println(s"Failure! {t.getMessage}")
}
Run Code Online (Sandbox Code Playgroud)

您还有一些其他强大的组合器函数,如API 文档中所示

而且,你还可以写一个更通用的方法重试失败,如在代码中的最后一块看到这个帖子