建設局專案總結(三)——ASP.NET 實現自動捕獲異常和異常處理
阿新 • • 發佈:2019-01-22
建設局專案幾乎要接近尾聲了,從頭到尾差不多有半個月的時間吧,半個月 不知不覺就這樣過去了,總結這半個月,好像每天都很忙,每天都很忙碌,但是仔細想想好像又沒做出多少正兒八經的工作量,總共做了下面幾個模組:
獎項懲罰列表,編輯等 |
企業資訊編輯申請 |
企業資訊編輯稽核 |
企業申請列表 |
公文釋出於接受公文 |
通用自動捕獲異常和異常處理 |
半個月的時間,就做了這些工作量,雖然老師說我們的工作量已經超過了他的估計了。也可能是我們隊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,所以難免有些錯誤,請大牛拍磚