NHibernate源码的异常处理方法
NHibernate所有的异常处理都派生自HibernateException类 发生在数据库层的原生异常被保留 没做处理
HibernateException类派生自系统的ApplicationException类 ApplicationException解释如下
The exception that is thrown when a non fatal application error occurs
抛出一个非致命的程序异常 HibernateException类的Serializable关键字 表明可以被序列化 可以保存成文件下来以做分析
系统中很多异常处理类 发生重要错误或异常时用log net记录下信息
看看NHibernate在事务提交时的异常处理方法
public void Commit()
{
using (new SessionIdLoggingContext(sessionId))
{
CheckNotDisposed();
CheckBegun();
CheckNotZombied();
log Debug( Start Commit );
if (session FlushMode != FlushMode Never)
{
session Flush();
}
NotifyLocalSynchsBeforeTransactionCompletion();
session BeforeTransactionCompletion(this);
try
{
trans Commit();
log Debug( IDbTransaction Committed );
mitted = true;
AfterTransactionCompletion(true);
Dispose();
}
catch (HibernateException e)
{
log Error( Commit failed e);
AfterTransactionCompletion(false);
mitFailed = true;
// Don t wrap HibernateExceptions
throw;
}
catch (Exception e)
{
log Error( Commit failed e);
AfterTransactionCompletion(false);
mitFailed = true;
throw new TransactionException( Commit failed with SQL exception e);
}
finally
{
CloseIfRequired();
}
}
}
其中 Don t wrap HibernateExceptions表明这样处理不会清掉已经发生的HibernateExceptions信息 就是在执行过程中抓到了其他的HibernateExceptions类型的异常就向上抛 这就是自定义异常处理的好处 Commit failed with SQL exception表明数据库sql事务提交执行出错 向上抛出HibernateExceptions类型的错误信息 因为都派生自HibernateException类
同类就throw 不是同类就throw个message
lishixinzhi/Article/program/net/201311/13778
2024-08-19 广告