在 Scala 中处理来自 Java API 调用的空值和异常

Handling null and exception from Java API call in Scala

我有以下代码(简化):

def getSomething(name: String): MyError \/ Option[Int] = {
    /* Returns Null if name doesn't exist, IOException if connection err. */
    val output: queryDB(name)

    // ...
}

queryDB 函数是一个 Java 调用。

我希望发生以下情况:IOException 映射到 MyErrornull 映射到 None。我该如何进行?

我知道我可以将输出包装在 Option 中,因为 null 映射到 None。但是,如何管理异常?

谢谢。

我认为您需要 Either 和 Try 的组合。使用 Try 的 "transform" 方法,您可以将结果转换为 Either[Throwable, Option[Int]]。类似的东西,

// Change the 2nd arg of transform to MyError as per your requirement.

def getSomething(name: String): Either[Throwable, Option[Int]] = {
    Try(queryDB(name)).transform(s => Success(Right(Option(s))), f => Success(Left(f))).get
}

我会结合使用 OptionTry

import scala.util.{ Try, Success, Failure }

def getSomething(name: String): MyError \/ Option[Int] = {

   Try(queryDB(name)) match {
     case Success(v) => Option(v).right // in case v is null, this returns a None
     case Failure(e) => MyError().left
   }

}

这会将所有异常变为 MyError。如果您需要特定的错误处理,您可以在 e 上匹配并具有更多粒度。

我还使用来自 scalaz 的 syntax 包的 .right.left。如果您不使用它们,可以分别用 \/-(Option(v))-\/(MyError()) 替换它们。