如何在Play中管理与数据库相关的异常!2.0/Scala使用Anorm

kaf*_*ein 6 scala-2.8 playframework anorm playframework-2.0

我目前正在玩Play 2.0(Scala).我必须承认这很有趣.我有一个与数据库操作异常有关的问题.

假设我将Car作为一个域类,并且我对其中一个字段有一个完整性约束,让我们说模型,以便在db中我不能有两(2)行具有相同的模型名称:

case class Car(id: Pk[Long], name: String, model: String)
Run Code Online (Sandbox Code Playgroud)

我试图在数据库中插入一条记录,如下所示:

def create(car: Car): Option[Long] = {
    DB.withConnection { implicit connection =>
      try {
          SQL("insert into cars (name, model) values ({name},{model}").on("name" -> car.name, "model" -> car.model).executeInsert()
      } catch {
          case e: Exception => {
          Logger.debug(e.getMessage())
          None
      } 
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我没有像前面的代码那样捕获异常,那么当我从我的控制器调用此方法时,模型中的数据已经存在于数据库中,我抛出以下异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Enzo' for key 'model'
Run Code Online (Sandbox Code Playgroud)

有没有办法捕获MySQLIntegrityConstraintViolationException而不是Exception,以便我可以对可能出错的地方进行细粒度控制,然后为我的用户提供更简洁的反馈(例如在浏览器或移动设备上)?

这是处理与数据库相关的操作和异常的最佳方法,还是每个人都使用的最佳实践?

提前致谢,

df'*_*df' 3

我认为你看起来像这样的东西:

import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException

catch {
  case e:MySQLIntegrityConstraintViolationException => Logger.debug("Whoops")
  case e:Exception  => {
    Logger.debug(e.getMessage())
    None
  }
}
Run Code Online (Sandbox Code Playgroud)

重要提示:请确保导入com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException,而不是导入com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException。更准确地说,确保您的导入与堆栈跟踪中的异常匹配。

至于最佳实践,我不知道,因为我也在使用这个框架:)。

至于向用户的反馈……也许 Flash Scope 是一种将单行文字传达到“下一页”的好方法(例如,汽车是否成功存储)。请参阅:http ://www.playframework.org/documentation/2.0/ScalaSessionFlash (向下滚动到“Flash 范围”。)