熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

NHibernate源碼的異常處理方法

2013-11-13 10:28:52  來源: .NET編程 

  NHibernate所有的異常處理都派生自HibernateException類發生在數據庫層的原生異常被保留沒做處理

  HibernateException類派生自系統的ApplicationException類ApplicationException解釋如下

  The exception that is thrown when a nonfatal application error occurs

  拋出一個非致命的程序異常HibernateException類的Serializable關鍵字表明可以被序列化可以保存成文件下來以做分析

  系統中很多異常處理類發生重要錯誤或異常時用lognet記錄下信息

  看看NHibernate在事務提交時的異常處理方法

  public void Commit()

  {

  using (new SessionIdLoggingContext(sessionId))

  {

  CheckNotDisposed();

  CheckBegun();

  CheckNotZombied();

  logDebug(Start Commit);

  if (sessionFlushMode != FlushModeNever)

  {

  sessionFlush();

  }

  NotifyLocalSynchsBeforeTransactionCompletion();

  sessionBeforeTransactionCompletion(this);

  try

  {

  transCommit();

  logDebug(IDbTransaction Committed);

  committed = true;

  AfterTransactionCompletion(true);

  Dispose();

  }

  catch (HibernateException e)

  {

  logError(Commit failed e);

  AfterTransactionCompletion(false);

  commitFailed = true;

  // Dont wrap HibernateExceptions

  throw;

  }

  catch (Exception e)

  {

  logError(Commit failed e);

  AfterTransactionCompletion(false);

  commitFailed = true;

  throw new TransactionException(Commit failed with SQL exception e);

  }

  finally

  {

  CloseIfRequired();

  }

  }

  }

  其中 Dont wrap HibernateExceptions表明這樣處理不會清掉已經發生的HibernateExceptions信息就是在執行過程中抓到了其他的HibernateExceptions類型的異常就向上拋這就是自定義異常處理的好處Commit failed with SQL exception表明數據庫sql事務提交執行出錯向上拋出HibernateExceptions類型的錯誤信息 因為都派生自HibernateException類

  同類就throw不是同類就throw個message

  另外不好的地方就是異常處理中沒包括標識信息使上層調用無法通過標識信息確定到底發什麼了什麼異常只能看到一個message 這個只有通過修改原碼來實現就是把一個個的標識加到一個異常message中以便上層抓到


From:http://tw.wingwit.com/Article/program/net/201311/13778.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.