ASP.NET实现错误处理的几种方式

来源:互联网 发布:网络课程 编辑:程序博客网 时间:2024/05/16 06:01

刚刚好项目中要用到,搜集了一些材料,整理出来和大家共享:

1、利用Page_Error 事件
Page_Error 事件提供一种捕获在页级别出现的错误的方法。
通过继承Page,实现我们自己的Page类,在自己的Page类中实现Page_Error,这样在需要的页面,更改页面继承自我们自己的Page。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// MyPage 的摘要说明
/// </summary>
public class MyPage : Page
{
    public MyPage()
    {

    }

    public void Page_Error(object sender, EventArgs e)
    {
        //记录错误信息
        Server.ClearError();

        //我需要在发生错误的时候记录下页面中控件的值,但是我在这里只是判断了TextBox,如果有需要,可以再扩展
        string controlInfo = string.Empty;
        foreach (Control tmp in Page.Controls)
        {
            if (tmp.GetType().ToString() == "System.Web.UI.HtmlControls.HtmlForm")
            {
                foreach (Control formtmp in tmp.Controls)
                {
                    if (formtmp.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
                    {
                        controlInfo += ((TextBox)formtmp).ClientID + ":" + ((TextBox)formtmp).Text;
                        controlInfo += Environment.NewLine;
                    }
                }
            }
        }
        Response.Write(controlInfo);
        //Server.Transfer("Error.aspx");
    }

在需要的页面我们public partial class Default4 : MyPage

2、使用Application_Error 事件
Global.asax 文件中添加Application_Error 实现代码。由于事件发生在整个应用程序范围内,因此您可记录应用程序的错误信息或处理其他可能发生的应用程序级别的错误。
protected void Application_Error(object sender, EventArgs e)
{
    Exception objErr = Server.GetLastError().GetBaseException();
    string err = "Error Caught in Application_Error event/n" +
        "Error in:" + Request.Url.ToString() +
        "/nError Message:"+ objErr.Message.ToString() +
        "/nStack Trace:"+ objErr.StackTrace.ToString();
    EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
    Server.ClearError();
//additional actions...
}

3、使用Web.Config文件
在Web.Config中<customErrors> 节部分设置处理错误

<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
</customErrors>

综述
    在1,2中我们都调用了Server.ClearError()方法。
    如果1中不使用Server.ClearError(),那么在gloable.asax的Application_Error中拦截到,如果2中没有使用Server.ClearError(),那么在Web.Config中定义的customErrors中将处理错误。
    我们要根据我们的个人需要进行错误处理,通过以上三种中有选择的使用或者有选择的组合使用,基本上可以达到我们的需要。

PS:上面的方法并没有对错误信息进行记录,可以根据个人需要把错误存储到DB,文件,系统日志等等

其他可以参考一下http://www.cnblogs.com/cnaspnet/archive/2007/03/20/680972.html这个网页,好像还有些错误,具体个人再研究吧。