我有以下代码(简化):
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
。但是,如何处理异常?谢谢。
最佳答案
我会结合使用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的
.right
包的.left
和syntax
。如果不使用它们,则可以分别用\/-(Option(v))
和-\/(MyError())
替换它们。关于java - 在Scala中处理Java API调用中的null和异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39038574/