探讨对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      return;
92    }
93    
94    try
95    {
96      RenderByCatchedException(writer);
97    }
98    catch (HttpUnhandledException)
99    {
100      throw;
101    }
102    catch (Exception ex)
103    {
104      RenderException(writer, ex);
105    }
106  }
107
108  /**//// <summary>
109  /// 呈现(已进行错误捕捉处理)
110  /// </summary>
111  /// <param name="writer"></param>
112  protected virtual void RenderByCatchedException(HtmlTextWriter writer)
113  {
114    base.Render (writer);
115  }
116
117  /**//// <summary>
118  /// 呈现异常
119  /// </summary>
120  /// <param name="writer"></param>
121  /// <param name="ex"></param>
122  private void RenderException(HtmlTextWriter writer, Exception ex)
123  {    
124    writer.AddAttribute(HtmlTextWriterAttribute.Title, BuildExceptionInfomation(ex));
125    writer.AddStyleAttribute("font-weight", "700");
126    writer.AddStyleAttribute("color", "#f00");
127    writer.AddStyleAttribute("border", "1px solid #ddd");
128    writer.AddStyleAttribute("cursor", "pointer");
129    writer.AddStyleAttribute("padding", "0px 3px 0px 3px");
130    writer.AddStyleAttribute("background-color", "#ffe");
131    writer.RenderBeginTag(HtmlTextWriterTag.Span);
132    writer.Write("!");
133    writer.RenderEndTag();
134  }
135
136  /**//// <summary>
137  /// 生成异常信息
138  /// </summary>
139  /// <param name="ex"></param>
140  /// <returns></returns>
141  private string BuildExceptionInfomation(Exception ex)
142  {
143    StringBuilder sb = new StringBuilder();
144    sb.Append(ex.Message);
145    sb.Append(Environment.NewLine);
146    sb.Append(ex.GetType().FullName);
147    sb.Append(Environment.NewLine);
148    sb.Append(ex.StackTrace);
149    return sb.ToString();
150  }
151  
152  /**//// <summary>
153  /// 中断程序的执行
154  /// </summary>
155  /// <param name="ex"></param>
156  protected virtual void Interrupt(Exception ex)
157  {
158    throw new HttpUnhandledException(ex.Message, ex);
159  }
160}
161

上面的代码只重载了OnPreRender、Render和CreateChildControls三个方法,实际上还有OnInit、OnLoad等,可以视实际需要而重载,这样重载之后,所有错误都被捕捉,并存放在错误栈中,并在呈现时将错误以某种格式呈现在界面上。注意,继承AbstractControl基类的控件应重载如RenderByCatchedException之类的方法。

如果某些错误不希望被捕捉,而是直接抛出到页面上,这时候还可以调用Interrupt方法来将错误直接抛出到页面上,并中断整个页面的执行。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索异常
, 控件
, exception
, 错误
, protected
, 处理
Web异常处理页面
webapi 异常处理、webservice异常处理、java web 异常处理、java web项目异常处理、webmagic 异常处理,以便于您获取更多的相关知识。

时间: 2024-09-24 05:18:13

探讨对Web控件的异常处理的相关文章

探讨ASP.NET 2.0的Web控件改进之概述

asp.net|web|控件 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩:但是,你是否了解到有关定制Web控件开发方面的重大变化?这正是我在本文中所想讨论的.如果你已经从事于控件开发,那么,我想本文所描述的ASP.NET 2.0中的新的改进特征会立即应用于你的控件开发中. 首先应该注意的是,你以前使用ASP.NET 1.1(或1.0)开发的所有Web控件在2.0版本下将继续良好运行-微软并没有破坏你的现有代码

探讨ASP.NET 2.0中的Web控件改进技术

asp.net|web|控件 ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这些内容展开全面探讨. 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩;但是,你是否了解到有关定制Web控件开发方面的重大变化?这正是我在本文中所想讨论的.如果你已经从事于控件开发,那么,我想本文所描述的ASP.NET 2.0中的新的改进特征会立即应用于

ASP.NET 2.0数据教程之第五十五:在Data Web控件显示二进制数据

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的教程我们阐述了应用程序处理二进制数据的2种模式, 以及使用FileUpload 控件从浏览器向服务器文件系统上传文件.当文件上传并存 储在文件系统里时,应在相应的数据库记录里存储该文件的存储路径. 我 们先来看如何为最终用户提供二进制数据.怎样展示二进制数据呢?这取决于其 类型.比如图片,我们将其显示为image:如果是PDFs,Microsoft Word文档.ZIP 文件或其它类型的数据,或许提供一个"Downl

ASP.NET4灵活显标记:数据Web控件改进

长期以来,使用Web控件的开发者都欣赏这些控件所具有的高生产力,但在控 制它们生成的标记方面却付出了一定的代价.例如,许多ASP.NET控件会自动地使 用元素来包装它们的内容,原因是为了方便布局或样式控制.然而,这种行为却 与过去几年中不断发展的网络标准相违背;这些标准支持使用更清洁和更简洁的 HTML标记,而建议节约使用<table>标记;同时,它们提倡应当尽可能使用 层叠样式表(CSS)来实现网页的布局和造型.此外,<table>元素和其他自 动添加的内容使得使用CSS来修饰W

在ASP.NET 2.0中操作数据之五十三:在Data Web控件显示二进制数据_自学过程

导言: 在前面的教程我们阐述了应用程序处理二进制数据的2种模式,以及使用FileUpload 控件从浏览器向服务器文件系统上传文件.当文件上传并存储在文件系统里时,应在相应的数据库记录里存储该文件的存储路径. 我们先来看如何为最终用户提供二进制数据.怎样展示二进制数据呢?这取决于其类型.比如图片,我们将其显示为image:如果是PDFs,Microsoft Word文档.ZIP文件或其它类型的数据,或许提供一个"Download"链接比较妥当. 在本节,我们看如何在GridView和D

一起谈.NET技术,ASP.NET4灵活显标记:数据Web控件改进

长期以来,使用Web控件的开发者都欣赏这些控件所具有的高生产力,但在控制它们生成的标记方面却付出了一定的代价.例如,许多ASP.NET控件会自动地使用元素来包装它们的内容,原因是为了方便布局或样式控制.然而,这种行为却与过去几年中不断发展的网络标准相违背;这些标准支持使用更清洁和更简洁的HTML标记,而建议节约使用标记;同时,它们提倡应当尽可能使用层叠样式表(CSS)来实现网页的布局和造型.此外,元素和其他自动添加的内容使得使用CSS来修饰Web控件和从客户端使用这些控件更加困难. ASP.NE

利用Ajax技术写一个迷你留言板WEB控件

ajax|web|控件 初学Ajax不久,自己写个小东西,以作学习日记留言板图片如下: 样例地址:http://www.8dao.net/miniguest/ 首先,这里用的是Access数据库,便于移动.数据库很简单,表Guest,字段有ID,Name,Content 要实现Ajax,利用asp.net ajax 1.0 bate是很方便的,在http://ajax.asp.net可以下载到.安装好后打开VS2005,新建一个ASP.net AJAX Enabled Web Site项目在里面

asp.net下web控件点评

asp.net下控件分二大类,分别在 System.Web.UI.WebControls System.Web.UI.HtmlControls 命名空间下,前者继承自WebControl,后者继承自HtmlControl,这二个类又都继承自System.Web.UI.Control额, windows平台,不论你从事什么开发,最终都需要有人调用loadlibrary.dll.那么asp.net控件,不论你使用什么控件,最终都要调用Render.其实做为前台开发,这些控件大部分不是那么好用. 1.

C#.NET的Web控件是否支持CSS

Web控件是否支持样式表(CSS)呢? 支持,所有的Web控件都从基类System.Web.UI.WebControls.WebControl中继承了一个叫做CssClass的属性. 示例源代码: <html> <head> <style> .Input { font: 10pt verdana; color: red; } </style> </head> <body> <form runat="server&quo