处理NHibernate异常

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块中,您应首先回滚事务并记录异常.那你的选择是:

  1. 重新抛出相同的异常,这是我的版本所做的
  2. 将它包装在你自己的异常中然后抛出它
  3. 无所事事地吞下异常,这很少是一个好主意

您没有任何实际选项来处理此方法中的异常.假设UI调用此方法,它应该在自己的try..catch中调用它,并通过向用户显示有意义的错误消息来处理它.您可以使用ExpectedException(type)属性进行单元测试.

要直接回答您的问题,您应该通过扩展Exception来创建自己的"明智错误",并将原始异常作为InnerException抛出.这是我在(2)中列出的异常包装技术.