在 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
映射到 MyError
,null
映射到 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
}
我会结合使用 Option
和 Try
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())
替换它们。
我有以下代码(简化):
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
映射到 MyError
,null
映射到 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
}
我会结合使用 Option
和 Try
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())
替换它们。