探讨对Web控件的异常处理
在使用ASP.NET时,常常使用Page的错误事件Error进行错误捕捉和处理。这种方式可以集中处理所有异常,这种方式有利有弊。集中处理的好处就不用啰嗦了,这里只说明一下这种方式的局限,就是当页面中的某个控件发生异常之后,整个页面执行都会中断,然后处理异常,这样一来,页面就无法显示。 在实际开发中,常常有这样的需求,即页面是由多个相对独立的控件组成,其中一个控件的错误不能影响到其它控件的正常显示。这就需要在控件内部捕捉错误,并自行处理错误,然而控件基类并没有提供这样的错误捕捉功能。如何用简单有效方法来实现呢? 其实我们可以实现一个基类,并把所有在控件生命期中会调用到的方法都封装起来,这样只要继承这个控件,就可以方便地实现在控件内部自行捕捉错误的功能。请看下面的代码: 1public abstract class AbstractControl: Control 2{ 3 /**//// <summary> 4 /// 异常栈 5 /// </summary> 6 public Stack Exceptions 7 { 8 get 9 { 10 if (exceptions == null) 11 { 12 exceptions = new Stack(); 13 } 14 return exceptions; 15 } 16 } 17 18 protected override void CreateChildControls() 19 { 20 try 21 { 22 CreateChildControlsByCatchedException(); 23 } 24 catch (HttpUnhandledException) 25 { 26 throw; 27 } 28 catch (Exception ex) 29 { 30 Exceptions.Push(ex); 31 } 32 } 33 34 /**//// <summary> 35 /// 创建子控件(已进行异常捕捉处理) 36 /// </summary> 37 protected virtual void CreateChildControlsByCatchedException() 38 { 39 } 40 41 /**//// <summary> 42 /// 43 /// </summary> 44 /// <param name="e"></param> 45 protected override void OnPreRender(EventArgs e) 46 { 47 try 48 { 49 OnPreRenderByCatchedException(e); 50 } 51 catch (HttpUnhandledException) 52 { 53 throw; 54 } 55 catch (Exception ex) 56 { 57 Exceptions.Push(ex); 58 } 59 } 60 61 /**//// <summary> 62 /// 呈现前事件(已进行错误捕捉处理) 63 /// </summary> 64 /// <param name="e"></param> 65 protected virtual void OnPreRenderByCatchedException(EventArgs e) 66 { 67 base.OnPreRender (e); 68 } 69 70 /**//// <summary> 71 /// 设计时的呈现前事件 72 /// </summary> 73 /// <param name="e"></param> 74 protected virtual void DesigningOnPreRenderByCatchedException(EventArgs e) 75 { 76 } 77 78 /**//// <summary> 79 /// 呈现 80 /// </summary> 81 /// <param name="writer"></param> 82 protected override void Render(HtmlTextWriter writer) 83 { 84 if (Exceptions.Count > 0) 85 { 86 while (Exceptions.Count > 0 ) 87 { 88 Exception ex = (Exception) Exceptions.Pop(); 89 RenderException(writer, ex); 90 } 91 r |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |