我有以下代码(简化):

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。但是,如何处理异常?

谢谢。

最佳答案

我会结合使用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的.right包的.leftsyntax。如果不使用它们,则可以分别用\/-(Option(v))-\/(MyError())替换它们。

关于java - 在Scala中处理Java API调用中的null和异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39038574/

10-12 19:33