C# fluent NHibernate会话异常处理
在会话期间应如何处理NHibernate异常?互联网上有很多例子: 还有许多StackOwerflow线程建议采用类似的方法:C# fluent NHibernate会话异常处理,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,在会话期间应如何处理NHibernate异常?互联网上有很多例子: 还有许多StackOwerflow线程建议采用类似的方法: using (ISession session = factory.OpenSession()) using (ITransaction tx = session.BeginTransaction()) { try { // do some work ...
using (ISession session = factory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
{
try
{
// do some work
...
tx.Commit();
}
catch (Exception e)
{
if (tx != null) tx.Rollback();
throw;
}
}
但是如果发生错误并且在代码的第1行抛出异常(当您打开会话时),该怎么办?没有一个例子能掩盖它
我的一所学院提出了这种方法:
ITransaction transaction = null;
try
{
using (ISession session = databaseFacade.OpenSession())
{
transaction = session.BeginTransaction();
//do some work
...
transaction.Commit();
}
}
catch (Exception ex)
{
if (transaction != null)
transaction.Rollback();
throw new Exception(ex.Message);
}
我建议解耦那些
- 公开会议
- 执行数据库操作
OpenSession()
异常的逻辑,以后不用担心。原因是,如果(像您的情况一样)databaseFacade.OpenSession()
抛出异常,您不必捕获它并检查事务,因为它必须为null
//if OpenSession() throws it's fine , not transaction at all
using (ISession session = databaseFacade.OpenSession())
{
using (ITransaction tx = session.BeginTransaction())
{
try
{
// do some work
...
tx.Commit();
}
catch (Exception e)
{
//tx is not null at this point
tx.Rollback();
throw;
}
}
}
如果OpenSession()抛出异常,则事务不会发生,这是正确的,但是如何处理该异常呢?在您的代码示例中,try-catch块不会处理它。还是我遗漏了什么?@SomeGuy如果OpenSession
失败,就没有什么可处理的了,因为还没有创建任何内容。实际上,您应该做的唯一一件事是重新显示异常,因为最有可能的应用程序将无法工作