Attualmente sto giocando con Play 2.0 (Scala). Devo ammettere che è molto divertente. Ho una domanda però relativa alle eccezioni operazioni database.Come gestire le eccezioni relative al DB in gioco! 2.0/Scala con Anorm
Diciamo che ho Car come una classe di dominio e che ho un vincolo di integrità su uno dei campi, diciamo che il modello modo che nel db non può avere due (2) file che hanno la stesso nome del modello:
case class Car(id: Pk[Long], name: String, model: String)
sto cercando di inserire un record nel DB in questo modo:
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
}
}
}
se non intercettare l'eccezione, come nel codice precedente, poi, quando io chiamo questo metodo dal mio controller con il modello che ha un valore già esistente nel database, ho il seguente eccezione generata:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Enzo' for key 'model'
C'è un modo per prendere il MySQLIntegrityConstraintViolationException invece di Eccezione in modo da avere un Fine- ad esempio il controllo su cosa può andare storto e quindi fornire un feed-back più conciso al mio utente, ad esempio (in un browser o su un dispositivo mobile)?
È questo il modo migliore per gestire le operazioni e le eccezioni relative al DB oppure esistono delle best practice che tutti utilizzano?
grazie in anticipo,
ho cercato di intercettare l'eccezione MySQLIntegrityConstraintViolationException come questo, ma non sta funzionando. Probabilmente perché MySQLIntegrityConstraintViolationException non è una case case e quindi non è idoneo per il pattern matching. – kaffein
@kaffein Le classi non-case possono essere abbinate semplicemente, non è possibile decostruirle, ad es. non puoi fare 'case NonCaseClass (e) =>', perché di default non hanno un metodo unpply. Nel mio caso il problema era un'importazione errata. Ho importato 'com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException' invece di' com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException' (notare il pacchetto 'jdbc4'). –