在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
   }

}