这个通用自动捕获异常和异常处理具体思路其实很简单,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,所以难免有些错误,请大牛拍砖