在Scala中处理Java API调用的null和异常
我有以下代码(简化):在Scala中处理Java API调用的null和异常,java,scala,exception,scalaz,Java,Scala,Exception,Scalaz,我有以下代码(简化): queryDB函数是一个Java调用 我希望发生以下情况:IOException映射到MyError,而null映射到None。我应该如何进行 我知道我可以将输出包装在选项中,因为null映射到None。但是,如何管理异常 谢谢。我想你需要两者的结合,然后再试一次。使用Try的“transform”方法,可以将结果转换为一个[Throwable,Option[Int]]。类似于 // Change the 2nd arg of transform to MyError a
queryDB
函数是一个Java调用
我希望发生以下情况:IOException
映射到MyError
,而null
映射到None
。我应该如何进行
我知道我可以将输出包装在选项中,因为null
映射到None
。但是,如何管理异常
谢谢。我想你需要两者的结合,然后再试一次。使用Try的“transform”方法,可以将结果转换为一个[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
}
我会结合使用选项
和尝试
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
。如果不使用这些,可以分别用\/-(选项(v))
和-\/(MyError())
替换它们 try/catch有什么问题吗?您也可以使用scala.util.Try
,即Try(Option(queryDB(name))
,但是老式的Try/catch在这里可能更简单。“如果您需要特定的错误处理,您可以在e上进行匹配,并具有更高的粒度。”
这是否意味着要查看Throwable
的getMessage
?不,我的意思是匹配异常类型
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
}
}