快速业务通道

探讨对Web控件的异常处理

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19

在使用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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号