6 nhibernate exception-handling exception unique-constraint
在NHibernate中处理异常的最佳实践是什么?
我有一个带有以下内容的SubjectRepository:
public void Add(Subject subject)
{
using (ISession session = HibernateUtil.CurrentSession)
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(subject);
transaction.Commit();
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试如下:
[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);
}
Run Code Online (Sandbox Code Playgroud)
我已经到了处理单元测试产生的错误并且有点卡住的问题.这会按预期失败,但是使用GenericADOException时,我期待一个ConstraintViolationException或类似的东西(在数据库级别的主题代码上存在唯一性约束).
ADOException包含一个MySQL Exception,它有一个明智的错误消息,但我不想通过抛出内部异常来开始破解封装.特别是因为MySQL没有最终确定为该项目的后端.
理想情况下,我希望能够捕获异常并在此时向用户返回合理的错误.是否有任何记录的最佳实践方法来处理NHibernate Exceptions并向用户报告出错的原因以及原因?
谢谢,
马特
Jam*_*Ide 13
我会在Add方法中处理它:
public void Add(Subject subject)
{
using (ISession session = HibernateUtil.CurrentSession)
using (ITransaction transaction = session.BeginTransaction())
{
try
{
session.Save(subject);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
// log exception
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在catch块中,您应首先回滚事务并记录异常.那你的选择是:
您没有任何实际选项来处理此方法中的异常.假设UI调用此方法,它应该在自己的try..catch中调用它,并通过向用户显示有意义的错误消息来处理它.您可以使用ExpectedException(type)属性进行单元测试.
要直接回答您的问题,您应该通过扩展Exception来创建自己的"明智错误",并将原始异常作为InnerException抛出.这是我在(2)中列出的异常包装技术.
| 归档时间: |
|
| 查看次数: |
11089 次 |
| 最近记录: |