Какова наилучшая практика для обработки исключений в NHibernate?Обработка исключений NHibernate
У меня SubjectRepository следующим:
public void Add(Subject subject)
{
using (ISession session = HibernateUtil.CurrentSession)
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(subject);
transaction.Commit();
}
}
И юнит тест следующим образом:
[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);
}
Я добрался до точки обработки ошибок, сгенерированных с помощью теста блока и немного застрял. Это происходит не так, как ожидалось, хотя с исключением GenericADOException, я ожидал исключение ConstraintViolationException или что-то подобное (существует ограничение уникальности для кода темы на уровне базы данных).
ADOException обертывает исключение MySQL, которое имеет разумное сообщение об ошибке, но я не хочу начинать нарушать инкапсуляцию, просто бросая внутреннее исключение. В частности, поскольку MySQL не завершен в качестве задней части для этого проекта.
В идеале я хотел бы иметь возможность поймать исключение и вернуть пользователю разумную ошибку на этом этапе. Существуют ли какие-либо задокументированные подходы к передовым методам обработки исключений NHibernate и отчетность перед пользователем о том, что пошло не так и почему?
Спасибо,
Matt
Я думаю, что исключение является лучшим вариантом. Внутреннее исключение - это что-то вроде строк сообщения MySQLException = «Дублировать запись« En »для клавиши 3». Поскольку это будет вызвано непосредственно передним концом, я хотел бы вернуть содержательное сообщение. – 2009-04-10 11:15:52
Это хорошая идея, чтобы перехватить ВСЕ исключения и обернуть ее? – VikciaR
Вы можете удалить большую часть этого кода, если вы просто перечеркиваете исключение - если транзакция явно не была совершена, она будет откат при закрытии сеанса (или, очевидно, если вызов фиксации бросает исключение, он будет попытайтесь отбросить его назад), поэтому просто отпустите исключение, и NH позаботится о транзакции, если она не совершила - вы получите те же самые эффекты с более чистым кодом. –