gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:25:13 24 4
gpt4 key购买 nike

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

假设我有 汽车 作为域类,并且我对其中一个领域有完整性约束,比如说 型号 所以在数据库中我不能有两(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
}
}
}

如果我没有像前面的代码那样捕获异常,那么当我从 Controller 调用此方法时,模型中已经存在数据库中的值,我会抛出以下异常:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Enzo' for key 'model'

有没有办法 catch MySQLIntegrityConstraintViolationException 而不是 异常(exception) 这样我就可以细粒度地控制可能出错的地方,然后向我的用户提供更简洁的反馈,例如(在浏览器中或在移动设备上)?

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

提前致谢,

最佳答案

我认为你看起来像这些行中的东西:

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 范围”。)

关于playframework - 如何在 Play 中管理与数据库相关的异常! 2.0/Scala 使用 Anorm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11511618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com