Qual è la procedura migliore per la gestione delle eccezioni in NHibernate?Gestione delle eccezioni NHibernate
Ho un SubjectRepository con il seguente:
public void Add(Subject subject)
{
using (ISession session = HibernateUtil.CurrentSession)
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(subject);
transaction.Commit();
}
}
E una prova di unità come segue:
[Test]
public void TestSaveDuplicate()
{
var subject = new Subject
{
Code = "En",
Name = "English"
};
_subjectRepository.Add(subject);
var duplicateSubject = new Subject
{
Code = "En",
Name = "English1"
};
_subjectRepository.Add(duplicateSubject);
}
sono arrivato al punto di gestire l'errore generato dal test di unità e rimasto un po 'bloccato Ciò non riesce come previsto, anche se con una GenericADOException mi aspettavo una ConstraintViolationException o qualcosa di simile (esiste un vincolo di univocità sul codice dell'oggetto a livello di database).
ADOException include un'eccezione MySQL con un messaggio di errore ragionevole ma non desidero iniziare a interrompere l'incapsulamento semplicemente lanciando l'eccezione interna. Soprattutto perché MySQL non è finalizzato come back-end per questo progetto.
Idealmente mi piacerebbe essere in grado di catturare l'eccezione e restituire un errore ragionevole all'utente a questo punto. Esistono approcci di best practice documentati per gestire le eccezioni NHibernate e riportare all'utente che cosa è andato storto e perché?
Grazie,
Matt
Penso che avvolgere l'eccezione sia l'opzione migliore. L'eccezione interna è qualcosa sulla falsariga di MySQLException Message = "Duplica voce 'En' per la chiave 3". Dato che questo sarà chiamato direttamente dal front-end, vorrei restituire un messaggio significativo. –
Questa è una buona idea, per cogliere TUTTE le eccezioni e avvolgerla? – VikciaR
Puoi rimuovere la maggior parte di questo codice, se stai solo rilanciando l'eccezione - se una transazione non è impegnata in modo esplicito, verrà ripristinata quando la sessione si chiude (o, ovviamente, se la chiamata di commit genera un'eccezione tentare di ripristinarlo), quindi lascia andare l'eccezione e NH si prenderà cura della transazione se non ha eseguito il commit - otterrai gli stessi effetti con un codice più pulito. –