Ich bin derzeit Play! Ing mit Play 2.0 (Scala). Ich muss zugeben, dass es sehr viel Spaß macht. Ich habe eine Frage im Zusammenhang mit Datenbankoperationen Ausnahmen.Wie man DB bezogene Ausnahmen im Spiel verwaltet! 2.0/Scala mit Anorm
Sagen wir, ich Auto als Domain-Klasse haben und dass ich eine Integritätsbedingung auf einem Feld haben, lassen Sie uns sagen, dass das Modell, so dass in der db ich nicht zwei haben kann (2) Reihen der mit gleiche Modellname:
case class Car(id: Pk[Long], name: String, model: String)
ich versuche, einen Datensatz in der DB wie folgt einzufügen:
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
}
}
}
wenn ich im vorigen Code nicht wie die Ausnahme abfangen, dann, wenn ich das nennen Methode von meinem Controller mit dem Modell einen Wert bereits bestehenden in der Datenbank hat, habe ich die folgende Ausnahme ausgelöst:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Enzo' for key 'model'
Gibt es eine Möglichkeit, die MySQLIntegrityConstraintViolationException statt Ausnahme so, dass ich eine fein- haben zu fangen genauste Kontrolle darüber, was schiefgehen kann und dann beispielsweise meinem Benutzer ein präziseres Feedback geben (in einem Browser oder auf einem mobilen Gerät)?
Ist dies der beste Weg, DB-bezogene Operationen und Ausnahmen zu behandeln, oder gibt es Best Practices, die jeder nutzt?
Vielen Dank im Voraus,
Ich versuchte, die MySQLIntegrityConstraintViolationException Ausnahme wie diese zu fangen, aber es funktioniert nicht. Wahrscheinlich, weil MySQLIntegrityConstraintViolationException keine Fallklasse ist und dann nicht für die Mustererkennung geeignet ist. – kaffein
@kaffein nicht-Case-Klassen können auf gut abgestimmt werden, Sie können sie nicht einfach dekonstruieren, z. Sie können 'case NonCaseClass (e) =>' nicht ausführen, da sie standardmäßig keine Methode zum Aufheben der Anwahl haben. In meinem Fall war das Problem ein falscher Import. Ich habe 'com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException' anstelle von' com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException' importiert (beachten Sie das Paket 'jdbc4'). –