ps0*_*604 3 scala playframework slick slick-3.0
下面的代码使用Slick 3.1.x从表中读取一行,尝试捕获任何SQL错误.UserDB是表的Slick表示,并且User是相关对象.
此代码不会在failure语句中编译,并出现以下错误:
类型不匹配; 发现:需要的单位:scala.concurrent.Future [Option [user.manage.User]]
如何解决此问题以捕获SQL错误?
def read (sk: Int): Future[Option[User]] = {
val users = TableQuery[UserDB]
val action = users.filter(_.sk === sk).result
val future = db.run(action)
future.onSuccess {
case result =>
if (!result.isEmpty)
Some(result(0))
else
None
}
future.onFailure { // <-- compilation error
case e => println (e.getMessage)
None
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用asTry方法将异常ex捕获到成功结果Failure(ex)和Success(v)中的成功值.在您的情况下,以下应该工作.
db.run(action.asTry).map{
case Failure(ex) => {
Log.error(s"error : ${ex.getMessage}")
None
}
case Success(x) => x
}
Run Code Online (Sandbox Code Playgroud)
正如所提到光滑文档,asTry用于管道的恢复处理逻辑的异常.