簡體   English   中英

如何在Play中管理與數據庫相關的異常! 2.0 / Scala使用Anorm

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM