建设局项目总结(三)——ASP.NET 实现自动捕获异常和异常处理

时间:2021-04-18 17:13:58

               建设局项目几乎要接近尾声了,从头到尾差不多有半个月的时间吧,半个月 不知不觉就这样过去了,总结这半个月,好像每天都很忙,每天都很忙碌,但是仔细想想好像又没做出多少正儿八经的工作量,总共做了下面几个模块:

奖项惩罚列表,编辑等

企业信息编辑申请

企业信息编辑审核

企业申请列表

公文发布于接受公文

通用自动捕获异常和异常处理

          半个月的时间,就做了这些工作量,虽然老师说我们的工作量已经超过了他的估计了。也可能是我们队ASP.NET没有任何基础原因吧,刚开始速度确实有点慢,这两天主要是做一个通用自动捕获异常和异常处理,刚开始,不知道ASP.NET提供了一些自动捕获异常的机制,所以第一天进展十分不顺利,查阅了半天的资料,总算利用两天的时间把它做完了。

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

 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).getValue("redirectPath"));
           
        }

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

发邮件:

/// <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);
        }

存日志:

 /// <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获取数据:


    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,所以难免有些错误,请大牛拍砖


本文为作者原创,转载请说明出处:http://blog.csdn.net/csh624366188/article/details/7268500