我目前在玩Play 2.0(Scala)。我必须承认这很有趣。我有一个问题,但与数据库操作异常有关。
假设我有 Car 作为域类,并且我对其中一个字段有完整性约束,让我们说模型以便在db中我可以没有两(2)行具有相同的型号名称:
case class Car(id: Pk[Long], name: String, model: String)
我正在尝试在DB中插入一条记录,如下所示:
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 而不是异常,以便我可以对可能出错的内容进行细粒度控制,然后提供更简洁的Feed-回到我的用户(例如在浏览器或移动设备上)?
这是处理与数据库相关的操作和异常的最佳方式,还是每个人都使用最佳实践?
提前感谢,
答案 0 :(得分:3)
我认为你看起来像这些内容:
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是将单行传达到“下一页”的好方法(例如,如果汽车成功存储或未成功存储)。请参阅:http://www.playframework.org/documentation/2.0/ScalaSessionFlash(向下滚动到“Flash范围”。)
答案 1 :(得分:1)
我在一个不同的游乐场工作,但据我所知,我解决了同样的问题。 我正在使用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 dependancy部分:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
<scope>runtime</scope>
</dependency>