playframework – 如何在Play中管理与DB相关的异常! 2.0/Scala
我目前正在玩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而不是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范围”.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |