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

Playframework 如何在游戏中管理与数据库相关的异常!使用Anorm的2.0/Scala,playframework,playframework-2.0,scala-2.8,anorm,Playframework,Playframework 2.0,Scala 2.8,Anorm,我现在正在玩!使用Play 2.0(Scala)升级。我必须承认这很有趣。不过,我有一个与数据库操作异常相关的问题 假设我有Car作为域类,并且我对其中一个字段有完整性约束,比如模型,这样在db中我就不能有两(2)行具有相同的模型名称: case class Car(id: Pk[Long], name: String, model: String) 我试图在数据库中插入一条记录,如下所示: def create(car: Car): Option[Long] = { DB.withC

我现在正在玩!使用Play 2.0(Scala)升级。我必须承认这很有趣。不过,我有一个与数据库操作异常相关的问题

假设我有Car作为域类,并且我对其中一个字段有完整性约束,比如模型,这样在db中我就不能有两(2)行具有相同的模型名称:

case class Car(id: Pk[Long], name: String, model: String)
我试图在数据库中插入一条记录,如下所示:

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
      } 
    }
}
如果我没有像前面的代码中那样捕获异常,那么当我使用数据库中已有值的模型从控制器调用此方法时,会引发以下异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Enzo' for key 'model'
是否有一种方法可以捕获MySQLIntegrityConstraintViolationException而不是异常,这样我就可以对可能出现的错误进行细粒度的控制,然后向我的用户(例如在浏览器或移动设备上)提供更简洁的反馈

这是处理与数据库相关的操作和异常的最佳方法,还是有大家都使用的最佳实践


提前谢谢,

我想你看起来像是在这些方面:

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

catch {
  case e:MySQLIntegrityConstraintViolationException => Logger.debug("Whoops")
  case e:Exception  => {
    Logger.debug(e.getMessage())
    None
  }
}
重要注意事项:确保导入
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
,而不是
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException
。更准确地说,确保导入与堆栈跟踪中的异常匹配

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


至于对用户的反馈。。。也许闪存示波器是将一行程序与“下一页”进行通信的好方法(例如,是否成功存储了汽车)。请参阅:(向下滚动至“Flash scope”。

我在一个稍微不同的工作场所工作,但据我所知,我解决了相同的问题。 我正在与liftweb、maven和scala 2.9合作

异常用RuntimeException包装。为了捕获它,我捕获RuntimeException并检查其原因。如果它违反了约束,我将执行我的业务,否则我将抛出异常。请参阅以下代码:

import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
...
  } catch {
      case e: RuntimeException => {
        e.getCause match {
          case cause: MySQLIntegrityConstraintViolationException => {
          ...
          }
          case _ => throw e
        }
      }
    }
如果生成失败并出现以下错误:

error: object mysql is not a member of package com
检查maven pom上mysql包的定义。在我的例子中,它被定义为运行时范围。将其更改为编译范围可以使构建成功,并且在运行时此捕获可以正常工作。 以下是maven pom.xml中的mysql依赖部分:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.18</version>
        <scope>runtime</scope>
    </dependency>

mysql
mysql连接器java
5.1.18
运行时

我试图像这样捕获MySQLIntegrityConstraintViolationException异常,但它不起作用。可能是因为MySQLIntegrityConstraintViolationException不是case类,因此不符合模式匹配的条件。@kaffein非case类可以很好地匹配,但不能解构它们,例如,不能执行
case NonCaseClass(e)=>
,因为默认情况下它们没有unapply方法。在我的例子中,问题是输入不正确。我导入了
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException
,而不是
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
(注意
jdbc4
包)。