我正在尝试根据FP范例转换以下函数:
def findByEmail(email: String): User = {
val result = jdbc.find("select * from user where email..")
return result;
}
我的第一次尝试是以下一次:
def findByEmail(email: String): Either[String, Option[User]] = {
try {
val result = jdbc.find("select * from user where email..")
} catch (Exception e) {
return Left(e.getMessage())
}
if (result == null) return Right(None)
Right(result)
}
我不喜欢的是捕获所有异常的尝试。这样的事情有什么好的做法吗?左侧是否有更好的数据类型而不是String?可以在那里使用Exception类吗?
答案 0 :(得分:5)
一种方法是改为Try[User]
。然后,来电者可以在Success[A]
或Failure[Throwable]
上匹配:
def findByEmail(email: String): Try[User] = Try { jdbc.find("select * from user where email..") }
然后强制调用者从Try
中提取数据或在其上撰写方法:
findByEmail("my@mail.com") match {
case Success(user) => // do stuff
case Failure(exception) => // handle exception
}
或者如果你想撰写方法:
// If the Try[User] is a Failure it will return it, otherwise executes the function.
findByEmail("my@mail.com").map { case user => // do stuff }
@Reactormonk在评论中写的另一个选项是使用doobie,它是针对Scala的JDBC的功能抽象层。