网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
..net中错误日志的写入.
.asp.net 2.0小TIPS两则.
.Web Service非Soap头(Session)身.
..net开发投票机的思路.
.UNIX时间戳与.net日期类的转换 .
.UrlRewriter重写地址的POSTBACK后.
.ASP.NET图象处理详解(2).
.ASP.NET中利用存储过程实现模糊查.
.asp.net2.0实现主从数据表的简单.
.在.NET框架应用程序中发送电子邮.
.ASP.NET 配置文件层次结构和继承.
.如何改变asp.net项目名称.
.用post方法从网上抓取信息.
.使用PagedDataSource类实现DataL.
.ASP.NET Whidbey中实现Provider.
.使用@Page指令的Src属性 简化对老.
.ASP.NET 2.0中的输出缓存.
.JSP与ASP.Net之间的Session值共享.
.安全的设置DropDownList等列表类.
.认识asp.net会话状态.

ASP.NET的错误处理机制

发表日期:2006-8-2


        对于一个Web应用程序来说,出错是在所难免的,因此我们应该未雨绸缪,为可能出现的错误提供恰当的处理。事实上,良好的错误处理机制正是衡量Web应用程序好坏的一个重要标准。试想一下,当用户不小心在浏览器输入了错误的URL或者当用户提供了一些信息导致程序出错的时候,如果我们没有对这些情况进行处理,而是任由404或是500的错误页面甚至出错的堆栈信息呈现在用户面前,这无疑会把一些用户给吓跑。所以,在我们开发Web应用程序的时候,应该对错误处理机制有充分的了解。
   
        让我们回到ASP.NET上来,先提两个问题让大家思考一下:ASP.NET为我们提供了几种错误处理机制呢?如果同时采用了几种错误处理机制,它们之间是否存在一定的优先级呢?带着这个问题,我们先来看一下我们最常见的Web.Config文件:

<?xml version="1.0"?>
    <configuration>
        <system.web>
            <customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
                <error statusCode="403" redirect="Error403.htm" />
                <error statusCode="404" redirect="Error404.htm" /> 
            </customErrors>
        </system.web>
    </configuration>


对于<customErrors>这个设置项,我想无需多言了,详情可以参考MSDN的。第一种错误处理机制——使用Web.Config的<customErrors>配置项应该是大家最常用的。
        接着,我们再看另外一个也很常用的文件:Global.asax。提到这个文件,大家想到了什么呢?对,就是跟两大Web应用程序对象(Application、Session)相关的事件了。在这些事件当中,有一个属于Application范畴的与错误相关的事件——Error,而对应的事件处理方法就是Application_Error了。顾名思义,这个事件处理方法在应用程序级别错误发生的时候就会被调用,因此你可以在这个方法中添加代码来对错误进行处理,如下所示:

protected void Application_Error(object sender, EventArgs e) {
    Exception objErr = Server.GetLastError().GetBaseException();
    Response.Write("Error:" + objErr.Message);
    Server.ClearError();
}

在这里,大家要注意最后一句代码的使用Server.ClearError(),为什么要使用这句代码呢?如果不用又会怎样呢?在这里我又先卖个关子。好了,第二种错误处理机制——使用Global.asax中的Application_Error事件处理方法也登台亮相了。

        以上这两种错误处理方法都可以说是全局性的,一个源自应用程序配置文件,一个则是必须放在应用程序根目录下的Global.asax文件的事件处理方法。与全局相对的就是局部,所以我们很自然的就会想:有没有应用于局部——某个页面的错误处理机制呢?答案是“有的”,而且还有两种————使用ErrorPage属性以及使用Page_Error事件处理方法。对于第一种机制,你几乎可以在任何时候设置ErrorPage属性,从而确定页面发生错误的时候会重定向至哪个页面;对于第二种机制而言,它与Application_Error事件处理方法是很类似的,只不过被触发的时机不同而已。以下是具体的两个例子:

<script language="C#" runat="server">
    protected void Page_Load(object sender, EventArgs e) {
        this.ErrorPage = "ErrorPage.htm";
       
    }  
</script>
 

protected void Page_Error(object sender, EventArgs e) {
    Exception objErr = Server.GetLastError().GetBaseException();
    Response.Write("Error:" + objErr.Message);
    Server.ClearError(); //同样要注意这句代码的使用
}   

        至此,四种错误处理机制已经悉数登场,是时候给它们排个名次了。从优先级高到低排序:Page_Error事件处理方法 > ErrorPage属性 > Application_Error事件处理方法 >  <customErrors>配置项。虽然排序是这样,但是这个排序之间又有微妙的关系。首先,要让ErrorPage属性能够发挥作用,<customErrors>配置项中的mode属性必须设为"On";其次,虽然Page_Error事件处理方法排在最前面,但是,如果少掉了Server.ClearError()方法的话,仍然会引发优先级较低的错误处理,这种情况对于Application_Error事件处理方法也是如此。顺序是排好了,但是顺序却不是最重要的问题,甚至可以说是没有太多意义的问题,因为在很多情况下,你可能并不会混合使用这四种处理机制。我想,最重要的问题还是在如何选用这些错误处理机制上。对于这个问题,希望有经验的朋友能够谈谈看法。
  
        好了,关于ASP.NET的四种错误处理机制就介绍到这里,也该说说自己的一些感受了。ASP.NET的设计者确实站在开发者的角度作了周全的考虑,因此提供了多达四种的错误处理机制供我们选用,这一点是值得称道的。但是套用一句广告词——多则惑,我们也会被这么多的错误处理机制弄得有些头晕。对照J2EE领域中的错误处理,我们可以发现会相对简单一些。首先是对应<customErrors>的设置,我们也可以从J2EE项目最常用的web.xml文件中找到类似的配置项:<errorPage>;其次,在J2EE的领域中,Page并不是一个重要的实体而且事件驱动模型也不是必需的,所以我还真的找不到与Application_Error和Page_Error方法对应处理机制;最后,在J2EE的领域中,更多强调的是Request和Response,一旦在逻辑处理中出现了错误,我们可以很容易地通过RequestDispatcher将Request分发到相应的错误处理模块中,事实上这是非常灵活的一种处理方式,有兴趣的朋友不妨了解一下。

上一篇:GridViewRow可以任意位置单击引发事件的方法 人气:5624
下一篇:小议优化ASP.NET应用性能之ViewState篇 人气:5584
浏览全部ASP.NET的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐