Was ist die beste Vorgehensweise beim Umgang mit Ausnahmen in NHibernate?Umgang mit NHibernate-Ausnahmen
Ich habe eine SubjectRepository mit folgendem bekam:
public void Add(Subject subject)
{
using (ISession session = HibernateUtil.CurrentSession)
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(subject);
transaction.Commit();
}
}
Und eine Einheit Test wie folgt:
[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);
}
ich zu dem Punkt, von dem Unit-Test erzeugt, um den Fehler der Handhabung und bin ein bisschen hängengeblieben. Dies schlägt wie erwartet fehl, obwohl ich mit einer GenericADOException eine ConstraintViolationException oder etwas Ähnliches erwartete (auf Datenbankebene gibt es eine Eindeutigkeitsbeschränkung für den Betreff-Code).
Die ADOException umschließt eine MySQL-Exception, die eine sinnvolle Fehlermeldung enthält, aber ich möchte nicht beginnen, die Kapselung durch einfaches Werfen der inneren Ausnahme zu unterbrechen. Zumal MySQL als Backend für dieses Projekt nicht abgeschlossen ist.
Idealerweise möchte ich in der Lage sein, die Ausnahme abzufangen und an diesem Punkt einen sinnvollen Fehler an den Benutzer zurückgeben. Gibt es dokumentierte Best-Practice-Ansätze für den Umgang mit NHibernate Exceptions und die Rückmeldung an den Benutzer, was schief gelaufen ist und warum?
Danke,
Matt
Ich denke, das Einwickeln der Ausnahme ist auch die beste Wahl. Die innere Ausnahme ist etwas in der Art von MySQLException Message = "Eintrag 'En' für Schlüssel 3". Da dies direkt vom Frontend aufgerufen wird, möchte ich eine sinnvolle Nachricht zurückgeben. –
Ist das eine gute Idee, ALLE Ausnahmen zu fangen und zu verpacken? – VikciaR
Sie können den Großteil dieses Codes entfernen, wenn Sie die Ausnahme gerade erneut auslösen. Wenn eine Transaktion nicht explizit festgeschrieben wird, wird sie beim Schließen der Sitzung zurückgesetzt (oder offensichtlich, wenn der Festschreibungsanruf eine Ausnahme auslöst) versuchen Sie es zurückzurollen), lassen Sie die Ausnahme einfach los und NH kümmert sich um die Transaktion, wenn sie nicht ausgeführt wurde - Sie erhalten die gleichen Effekte mit saubereren Code. –