Playframework 如何在游戏中管理与数据库相关的异常!使用Anorm的2.0/Scala
我现在正在玩!使用Play 2.0(Scala)升级。我必须承认这很有趣。不过,我有一个与数据库操作异常相关的问题 假设我有Car作为域类,并且我对其中一个字段有完整性约束,比如模型,这样在db中我就不能有两(2)行具有相同的模型名称: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
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
包)。