[英]How to manage DB related Exceptions in Play! 2.0/Scala using 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.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 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 dependancy部分:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
<scope>runtime</scope>
</dependency>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.