NHibernate所有的异常处理都派生自HibernateException类发生在数据库层的原生异常被保留没做处理
HibernateException类派生自系统的ApplicationException类ApplicationException解释如下
The exception that is thrown when a nonfatal application error occurs
抛出一个非致命的程序异常HibernateException类的Serializable关键字表明可以被序列化可以保存成文件下来以做分析
系统中很多异常处理类发生重要错误或异常时用lognet记录下信息
看看NHibernate在事务提交时的异常处理方法
public void Commit()
{
using (new SessionIdLoggingContext(sessionId))
{
CheckNotDisposed();
CheckBegun();
CheckNotZombied();
logDebug(Start Commit);
if (sessionFlushMode != FlushModeNever)
{
sessionFlush();
}
NotifyLocalSynchsBeforeTransactionCompletion();
sessionBeforeTransactionCompletion(this);
try
{
transCommit();
logDebug(IDbTransaction Committed);
committed = true;
AfterTransactionCompletion(true);
Dispose();
}
catch (HibernateException e)
{
logError(Commit failed e);
AfterTransactionCompletion(false);
commitFailed = true;
// Dont wrap HibernateExceptions
throw;
}
catch (Exception e)
{
logError(Commit failed e);
AfterTransactionCompletion(false);
commitFailed = true;
throw new TransactionException(Commit failed with SQL exception e);
}
finally
{
CloseIfRequired();
}
}
}
其中 Dont wrap HibernateExceptions表明这样处理不会清掉已经发生的HibernateExceptions信息就是在执行过程中抓到了其他的HibernateExceptions类型的异常就向上抛这就是自定义异常处理的好处Commit failed with SQL exception表明数据库sql事务提交执行出错向上抛出HibernateExceptions类型的错误信息 因为都派生自HibernateException类
同类就throw不是同类就throw个message
另外不好的地方就是异常处理中没包括标识信息使上层调用无法通过标识信息确定到底发什么了什么异常只能看到一个message 这个只有通过修改原码来实现就是把一个个的标识加到一个异常message中以便上层抓到