zoukankan      html  css  js  c++  java
  • try catch 块的使用原则

    举一个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.


  • 相关阅读:
    Git log、diff、config 进阶
    Firefox 修改User Agent
    改Chrome的User Agent,移动版网络
    ThinkPHP 更新数据 save方法
    ThinkPHP:create()方法有什么用呢?
    js控制select选中显示不同表单内容
    GPS通讯协议协议(NMEA0183)
    Linux pkg-config命令
    OpenCV编程
    GTK编程
  • 原文地址:https://www.cnblogs.com/idior/p/139182.html
Copyright © 2011-2022 走看看