关于异常处理的注意事项一: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: