(Exception handle)分层架构异常处理机制
针对于通常的三层架构 我们需要针对于异常做一些处理,从上面的异常处理组件图当中,我们能看到自定义异常和异常处理层层上抛,具体我们还是来看代码吧!
自定义异常:
/// <summary>
/// 自定义BLL层异常类
/// </summary>
[Serializable]
public class BLLException : Exception, ISerializable
{
private string myBLLMsg;
/// <summary>
/// 自定义本地文本信息属性
/// </summary>
public string MyBLLMsg
{
get
{
return myBLLMsg;
}
}
/// <summary>
/// 重写只读本地文本信息属性
/// </summary>
/// <remarks>
/// 在myExcuteMsg不存在的情况下,返回继承Base.Message,
/// 如果存在则返回 myExcuteMsg + base.Message
/// </remarks>
public override string Message
{
get
{
return myBLLMsg == null ? base.Message : myBLLMsg + base.Message;
}
}
/// <summary>
/// 实现基类的各公用构造函数
/// </summary>
public BLLException()
: base() { }
/// <summary>
/// 实现基类的各公用构造函数
/// </summary>
/// <param name="message">基类的异常消息</param>
public BLLException(string message)
: base(message) { }
/// <summary>
/// 实现基类的各公用构造函数
/// </summary>
/// <param name="messager">基类的异常消息</param>
/// <param name="innerException">导致当前异常的异常</param>
public BLLException(string messager, Exception innerException)
: base(messager, innerException) { }
/// <summary>
/// 实现自定义消息公用构造函数
/// </summary>
/// <param name="message">基类的异常消息</param>
/// <param name="myExcuteMsg">自定义异常信息</param>
public BLLException(string message, string myExcuteMsg)
: base(message)
{
this.myBLLMsg = myExcuteMsg;
}
/// <summary>
/// 实现自定义消息公用构造函数
/// </summary>
/// <param name="messager">基类的异常消息</param>
/// <param name="myExcuteMsg">自定义异常信息</param>
/// <param name="innerException">导致当前异常的异常。</param>
public BLLException(string messager, string myExcuteMsg, Exception innerException)
: base(messager, innerException)
{
this.myBLLMsg = myExcuteMsg;
}
protected BLLException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
myBLLMsg = info.GetString("MydelMsg");
}
/// <summary>
/// 重写GetObjectData方法,实现向SerializationInfo中添加自定义字段信息。
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("MydelMsg", myBLLMsg);
base.GetObjectData(info, context);
}
}
DAC层异常处理:
public class BaseDataHelper : IBaseDataHelper
{
#region IBaseDataHelper 成员
public System.Data.DataSet BaseQuery(string strSql)
{
try
{
return DbHelperOra.Query(strSql);
}
catch (DACException ex)
{
throw new DACException("数据库访问错误", "查询公用模块错误", ex);
}
}
#endregion
#region IBaseDataHelper 成员
public int ExecuteSql(string strSql)
{
try
{
return DbHelperOra.ExecuteSql(strSql);
}
catch (DACException ex)
{
throw new DACException("数据库访问错误", "执行SQL语句出错", ex);
}
}
public bool ExecuteSqlTran(ArrayList SQLStringList)
{
try
{
DbHelperOra.ExecuteSqlTran(SQLStringList);
}
catch (DACException ex)
{
throw new DACException("数据库访问错误", "执行事务出错", ex);
}
return true;
}
public bool ExecuteSqlTran(Hashtable SQLStringList)
{
try
{
DbHelperOra.ExecuteSqlTran(SQLStringList);
}
catch (DACException ex)
{
throw new DACException("数据库访问错误", "执行事务出错", ex);
}
return true;
}
#endregion
#region IBaseDataHelper 成员
public object GetSingle(string strSql)
{
try
{
return DbHelperOra.GetSingle(strSql);
}
catch (DACException ex)
{
throw new DACException("数据库访问错误", "获取单个对象出错", ex);
}
}
#endregion
}
BLL异常处理:
public class UserBLL:IUserManager
{
#region IUserManager 成员
public System.Data.DataTable GetUserDataTable()
{
try
{
string strsql = "select * from napp_accounts_user ";
return DataAccess.CreateBaseDataHelper().BaseQuery(strsql).Tables[0];
}
catch (BLLException ex)
{
throw new BLLException("查询用户业务", ex);
}
}
#endregion
}
界面异常处理:
log4net.ILog logger = log4net.LogManager.GetLogger(typeof(_Default));
protected void Page_Load(object sender, EventArgs e)
{
try
{
DataTable dt = BLLAccess.CreateUserBLL().GetUserDataTable();
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
}
catch(Exception ex)
{
//log4net记录异常错误
logger.Error("查询用户绑定GetUserDataTable() Error:" + ex.ToString());
//在此可添加返回错误页面
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述