1>事件在try catch中的运用
在多层架构中try catch事件类似于冒泡,如果不对代码做任何处理,无论哪一层发生异常,都会在最顶层的ul层显示出异常信息。所以个人观点,异常的捕获工作最好在ul层。这样所有层级报的异常都可以被捕获到,因为错误会像气泡一样最终会在显示层暴露出来。在每次设计到数据库的时候捕获异常,这样每个页面的数据操作都会被try catch包裹,有没有一种更好得方法,让代码更简洁。答案是肯定的。将控件事件包裹起来,重新申明一个事件,在该事件中调用控件的事件,并且捕获异常。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 using System.Reflection; 9 10 public partial class _Default : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 btn.Click += new EventHandlerWrap(btn_Click); 15 } 16 17 protected void btn_Click(object sender, EventArgs e) 18 { 19 lbTime.Text = DateTime.Now.ToString(); 20 } 21 } 22 public class EventHandlerWrap 23 { 24 private EventHandler handler; 25 private EventHandler Handler; 26 public EventHandlerWrap(EventHandler handler) 27 { 28 this.handler = handler; 29 Handler = InVoke; 30 } 31 32 public static implicit operator EventHandler(EventHandlerWrap wrap) 33 { 34 return wrap.Handler; 35 } 36 37 private void InVoke(object sender, EventArgs e) 38 { 39 try 40 { 41 this.handler(sender, e); 42 } 43 catch (Exception ex) 44 { 45 LogError(ex.Message); 46 } 47 } 48 49 private void LogError(string errorMsg) { } 50 }
2>事件在用户控件中运用
项目中会设计到报表的流程流转,用到了公司自己研发的工作流,该工作流的功能关联了报表的删除以及状态的显示,所以不同的报表都会添加该工作流,这会导致一个问题的出现,每个页面都必须添加工作流,实现删除功能和状态显示,重复的工作就出现了,所以最总的选择是将工作流的操作和状态封装到自定义空间中。状态的显示可以从工作流实例中通过id获取,但是报表的删除则需要知道具体的表,所以必须把删除操作放在页面,解决的方案是在用户控件中申明一个事件,将删除的操作委托到具体的每个表报的页面中。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 public partial class UserControls_WorkFlow : System.Web.UI.Page 9 { 10 public EventHandler Delete; 11 protected void Page_Load(object sender, EventArgs e) 12 { 13 14 } 15 protected void lbnDel_Click(object sender, EventArgs e) 16 { 17 if (Delete != null) 18 Delete(sender, e); 19 } 20 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现