您的位置:首页 > 编程语言 > ASP

ASP.NET 实现自动捕获异常和异常处理

2012-12-18 20:34 483 查看
 
         这个通用自动捕获异常和异常处理具体思路其实很简单,ASP.NET在应用程序级别处理异常的代码都是放在Global.asax的Application_Error事件处理下的:

[csharp]
view plaincopyprint?

protected void Application_Error(object sender, EventArgs e)  
       {  
           // 在出现未处理的错误时运行的代码    
           Exception objErr = Server.GetLastError().GetBaseException();  
           string configPath = Server.MapPath("~/Exception.config");  
           string log = ErroUtil.Write2Log(objErr);  
           ErroUtil.PostEmail(log);  
           Server.ClearError();  
           Response.Redirect( new XmlParse(configPath).getVal
4000
ue("redirectPath"));  
            
       }  

        我们可以在上面的事件处理的方法中捕获所有的异常,而且还可以把异常记录到日志文件,并且同时发送Email告诉开发人员出现了什么问题,如下:

发邮件:

[csharp]
view plaincopyprint?

/// <summary>  
        /// 把抛出异常的信息以邮件的形式  
        /// 发送给开发人员便于维护  
        /// </summary>  
        /// <param name="log">抛出异常的信息</param>  
        public static void PostEmail(string log)  
        {//发邮件  
            //获得配置信息,邮箱服务器名称,发送和接受邮箱地址,密码  
            string stmpServer = parse.getValue("stmpServer");  
            string email = parse.getValue("email");  
            string password = parse.getValue("password");  
            System.Net.Mail.SmtpClient client = new SmtpClient(stmpServer);  
            client.UseDefaultCredentials = false;  
            client.Credentials = new System.Net.NetworkCredential(email, password);  
            client.DeliveryMethod = SmtpDeliveryMethod.Network;  
            System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();  
            mail.From = new MailAddress(email);  
            mail.To.Add(email);  
            mail.Subject = System.DateTime.Now.ToString() + "";  
            mail.BodyEncoding = System.Text.Encoding.Default;  
            mail.Body = log;  
            //client.Send(mail);  
        }  

存日志:

[csharp]
view plaincopyprint?

/// <summary>  
       /// 根据所抛出的异常,组成异常信息字符串  
       /// 并且把异常信息存储到日志里面  
       /// </summary>  
       /// <param name="objErr"></param>  
       /// <returns></returns>  
       public static string Write2Log(Exception objErr)  
       {  
           string errortime = string.Empty;  
           string erroraddr = string.Empty;  
           string errorinfo = string.Empty;  
           string log = string.Empty;  
           errortime = "发生时间:" + System.DateTime.Now.ToString();  
           //erroraddr = "发生异常页: " + Request.Url.ToString();  
           errorinfo = "异常信息: " + objErr.Message;  
           System.IO.StreamWriter writer = null;  
           //获取配置信息,日志存储地址,本项目名称  
           string logFile = parse.getValue("logFile");  
           string projectName = parse.getValue("projectName");  
           try  
           {  
                   // 写入日志    
                   string year = DateTime.Now.Year.ToString();  
                   string month = DateTime.Now.Month.ToString();  
                   string path = logFile;  
                   writer = new System.IO.StreamWriter(path, true);  
                   //string ip = "用户IP:" + Request.UserHostAddress;erroraddr + "<br/>" + ip +  
                   log = errortime+"   " + projectName+"   " + objErr.ToString() + errorinfo + "<br>" + "   ";  
                   writer.WriteLine(log);  
           }  
           finally  
           {  
               if (writer != null)  
                   writer.Close();  
           }  
           return log;  
       }  

为了做成通用的,我们把一些配置信息,保存到xml里面,然后通过解析xml来获取数据,解析xml获取数据:

[csharp]
view plaincopyprint?

public class XmlParse  
{  
    private string filename; //文件路径  
    public string nodeName = null;//获取的值的节点名称  
    //构造函数,filename是xml文件的路径  
    public XmlParse(string filename)  
    {  
        this.filename = filename;  
    }  
    public string getValue(string nodeName)  
    {  
        //XmlTextReader reader = new XmlTextReader(filename);  
        XmlDocument doc = new XmlDocument();  
        doc.Load(filename);  
        XmlNodeList list = doc.DocumentElement.ChildNodes;  
        foreach (XmlNode item in list)  
        {  
            if (item.Name == nodeName) {  
                string s = item.InnerText;  
                return item.InnerText;  
            }  
        }  
        return null;  
    }  
}  

由于配置文件中有邮箱和密码信息,xml代码就不贴了,这个xml也很简单,总共也就十行左右。到此为止,整个通用自动捕获异常和异常处理机制就完成了,由于本人刚刚接触ASP.NET,所以难免有些错误,请大牛拍砖
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Asp.net
相关文章推荐