代码改变世界

关于异常处理的注意事项一:throw exception(SQLiteDB 异常信息)

2011-07-21 11:23  李泱  阅读(1430)  评论(1编辑  收藏  举报

       在代码中有一些问题经常会用到异常处理,如数据库、文件、网络的调用中,都会关注到一些特殊的问题处理,那么就会用到异常的关注。

今天主要关注异常的throw问题,如何在分层调用中理清各层之间的异常处理的职责,下面例举示例代码进行说明:

1、DAL层没有throw ex的情况: 

DAL层try-catch :

using (DbConnection conn = db.CreateConnection())
{
conn.Open();
DbTransaction trans = conn.BeginTransaction();
try
{
ret = db.ExecuteNonQuery(dbCommand);
trans.Commit();
}
catch
{
trans.Rollback();

}

conn.Close();

}

UI层就是最顶的try-catch:

  try

                        {
                            cns_bll.UpdateComID(key);//提交更新数据库
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "系统提示");
                        }

 以上DAL层没有throw ex,则UI层永远也没捕获到异常的信息,所以UI层则

失去对数据库调用的异常情况的监控;、

2、那么针对以上情况有两种解决方案:

1)、只在顶层添加异常处理try-catch;

2)、在底层只对容易发生异常的小块进行try-catch,而且在catch中只对特定的异常进行处理,并且为了上层能捕获这些异常信息,则要加throw ex语句。

  DAL层try-catch:

using (DbConnection conn = db.CreateConnection())
{
conn.Open();
DbTransaction trans = conn.BeginTransaction();
try
{
ret = db.ExecuteNonQuery(dbCommand);
trans.Commit();
}
catch(SQLiteException ex)
{
trans.Rollback();

throw ex; 

}

conn.Close();

}

 3、题外话题:今天在调试代码过程中,发现一个以前没有遇到过的

SQLiteException异常:
The database file is locked database is locked,先记录下,以后分析。

 System.Data.SQLite.SQLiteException was caught

  Message=The database file is locked database is locked
  Source=System.Data.SQLite
  ErrorCode=-2147467259
  StackTrace:
       at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
       at System.Data.SQLite.SQLiteDataReader.NextResult()
       at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
       at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
       at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
       at Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteNonQuery(DbCommand command)
       at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DbCommand command)
       at SouthGIS.DAMS.ArchivesScan.DAL.CommonNameSettingDAL.UpdateComID(Int32 comID) in D:\DAMS_SVN\源码\Current\ArchivesScan\ScanPluginDAL\CommonNameSettingDAL.cs:line 155
  InnerException: