享受代码,享受人生

SOA is an integration solution. SOA is message oriented first.
The Key character of SOA is loosely coupled. SOA is enriched
by creating composite apps.
posts - 213, comments - 2315, trackbacks - 162, articles - 45
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

try catch 块的使用原则

Posted on 2005-04-17 11:57  idior  阅读(...)  评论(... 编辑 收藏

举一个NHibernate的例子
ISession session;
ITransaction tx;

try
{
session = factory.OpenSession();
tx = session.BeginTransaction();
// do database work
tx.Commit();
session.Close();
}
catch (Exception ex)
{
tx.Rollback();
session.Close();
// further exception handling
}

I can’t claim to know the inner workings of OpenSession but if there’s a chance it throws and surfaces an exception, the catch is going to access a null reference, tx. General advice:

Acquire Resource;
Try
Do Something with Resource
Catch
Do something
Finally
Release Resource


Actually there’s a semantic implication of OpenSession. To me it should either return a valid ISession reference to an open reference or it should throw an exception. The same goes for BeginTransaction. So, IMHO this is how to write it (my 2c):

ISession session = factory.OpenSession();
try
{
  ITransaction tx = session.BeginTransaction();
  try
  {
    // do db work
    tx.Commit();
  }
  catch
  {
    tx.Rollback();
  }
}
finally
{
  session.Close();
}

Both session in finally and tx in catch will be valid references provided that OpenSession and BeginTransaction returns what they atomically should return, i.e. an open session in the former case and a started transaction in the latter case.