Aktualnie gram w Play 2.0 (Scala). Muszę przyznać, że to świetna zabawa. Mam pytanie związane z operacjami bazy danych wyjątkami.Jak zarządzać wyjątkami związanymi z bazą danych w grze! 2.0/Scala za pomocą Anorma
Powiedzmy mam Car jako klasa domeny i że mam ograniczenie integralności jednej dziedzinie, powiedzmy modelu tak że w db nie mogę mieć dwa (2) wiersze o sama nazwa modelu:
case class Car(id: Pk[Long], name: String, model: String)
próbuję wstawić rekord w DB takiego:
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
}
}
}
jeśli nie złapać wyjątek jak w poprzednim kodzie, wtedy kiedy ja nazywam to metoda z mojego kontrolera z modelu o wartości już istniejących w bazie danych, mam następujący wyjątek rzucony:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Enzo' for key 'model'
Czy istnieje sposób, aby złapać MySQLIntegrityConstraintViolationException zamiast wyjątek tak, że mam Precyzyjna szczegółową kontrolę nad tym, co może pójść nie tak, a następnie dostarczyć bardziej zwięzłe informacje zwrotne do mojego użytkownika na przykład (w przeglądarce lub na urządzeniu mobilnym)?
Czy jest to najlepszy sposób na obsługę operacji i wyjątków związanych z bazami danych lub czy istnieją jakieś sprawdzone metody, z których każdy korzysta?
góry dzięki,
Próbowałem złapać wyjątek MySQLIntegrityConstraintViolationException takiego, ale to nie działa. Prawdopodobnie dlatego, że MySQLIntegrityConstraintViolationException nie jest klasą przypadku, a następnie nie kwalifikuje się do dopasowania wzorców. – kaffein
@kaffein klas nie-przypadkowych można dopasować po prostu dobrze, po prostu nie można ich dekonstruować, np. nie można wykonać 'case NonCaseClass (e) =>', ponieważ domyślnie nie mają one metody unapply. W moim przypadku problemem był nieprawidłowy import. Zaimportowałem 'com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException' zamiast' com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException' (zwróć uwagę na pakiet 'jdbc4'). –