2015-02-26 4 views
1

Как следует обрабатывать исключения NHibernate во время сеансов? Есть много примеров через Интернет:Свободное управление исключениями сеанса NHibernate

http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-exceptions https://svn.code.sf.net/p/nhibernate/code/trunk/nhibernate/src/NHibernate/ISession.cs

И много, много StackOwerflow нитей, которые предлагают подход, аналогичный этому:

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; 
     } 
    } 

Но что, если происходит ошибка, и исключение составляет брошен на первую строку кода (когда вы открываете сеанс)? Ни один из примеров не прикрывает его!

colege мой мотивационные этот подход:

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); 
    } 

ответ

1

Я предлагаю развязывающие компоненты, которые

  • открыть сеанс
  • выполнения операций с базой данных

с таким подходом вы можете сохранить логика обработки OpenSession() исключений внутри 1-го и не беспокойтесь позже. Причина в том, что если (как в вашем случае) databaseFacade.OpenSession() кидает исключение вы не должны поймать его и проверить transaction, поскольку он должен быть 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; 
      } 
     } 
    } 
+0

правильно, что если OpenSession() генерирует исключение, транзакция делает не так, но как вы справляетесь с этим исключением? В вашем примере кода блок catch try не обрабатывал бы его. Или я чего-то не хватает? – Stralos

+0

@SomeGuy, если 'OpenSession' терпит неудачу, не с чем работать, поскольку ничего еще не создано. Фактически единственное, что вам нужно сделать - это переосмыслить исключение, потому что, скорее всего, приложение не сможет работать – tchrikch

Смежные вопросы