1. 程式人生 > >建設局專案總結(三)——ASP.NET 實現自動捕獲異常和異常處理

建設局專案總結(三)——ASP.NET 實現自動捕獲異常和異常處理

               建設局專案幾乎要接近尾聲了,從頭到尾差不多有半個月的時間吧,半個月 不知不覺就這樣過去了,總結這半個月,好像每天都很忙,每天都很忙碌,但是仔細想想好像又沒做出多少正兒八經的工作量,總共做了下面幾個模組:

獎項懲罰列表,編輯等

企業資訊編輯申請

企業資訊編輯稽核

企業申請列表

公文釋出於接受公文

通用自動捕獲異常和異常處理

          半個月的時間,就做了這些工作量,雖然老師說我們的工作量已經超過了他的估計了。也可能是我們隊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,所以難免有些錯誤,請大牛拍磚