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 }