在 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)
}
下面的代码使用 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)
}