在 Slick 中捕获 SQL 未来失败的错误

Catching SQL error on future failure in Slick

下面的代码使用 Slick 3.1.x 从 table 中读取一行,试图捕获任何 SQL 错误。 UserDB 是 table 的 Slick 表示,User 是相关对象。

此代码无法在 failure 语句中编译,出现以下错误:

type mismatch; found : Unit required: 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
      }
   }

您可以使用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
}

slick documentation 中所述,asTry 用于流水线化恢复处理逻辑的异常。

以后可以使用onComplete方法

        future.onComplete{
            case Success(r) ⇒ ...
            case Failure(t) ⇒ log.error("failure in db query " + t.getMessage)
        }