在Slick中捕获未来故障时的SQL错误

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)

Sha*_*mez 7

您可以使用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用于管道的恢复处理逻辑的异常.