一、自定义错误页面 有些时候,我们想使用自定义的错误页面,该怎么处理那。
翻页其他大牛写的博客,看到有这种方式,自定义属性Class继承FileterAttribute,
重写OnException方法,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 public class MyErrorAttribute: HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { //获取异常对象 Exception ex = filterContext.Exception; //记录错误日志 //记录出现错误的IP地址 string strIP = filterContext.HttpContext.Request.UserHostAddress; string strUser = System.Environment.MachineName; ; string strPath = filterContext.HttpContext.Request.Path; StringBuilder sb = new StringBuilder(); sb.Append("IP:【" + strIP + "】" + Environment.NewLine); sb.Append("UserName:【" + strUser + "】" + Environment.NewLine); sb.Append("Action:【" + strPath + "】" + Environment.NewLine); sb.Append("Error in 【" + filterContext.HttpContext.Request.Url.ToString() + "】" + Environment.NewLine); sb.Append("Error Message 【" + ex.Message + "】" + Environment.NewLine); sb.Append("Browser 【" + filterContext.HttpContext.Request.Browser.Browser + "||"); sb.Append(filterContext.HttpContext.Request.Browser.Id + "||"); sb.Append(filterContext.HttpContext.Request.Browser.Version + "||"); sb.Append(filterContext.HttpContext.Request.Browser.Beta + "】"); //记录错误 WriteError(sb.ToString()); //导向友好错误界面 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary( new { controller = "Error", action = "Page404", returnUrl = filterContext.HttpContext.Request.Url, returnMessage = "页面不存在!" } )); //重要!!!告诉系统异常已经处理!! //如果没有这个步骤,系统还是会按照正常的异常处理流程做 filterContext.ExceptionHandled = true; //base.OnException(filterContext); }
1、记录错误信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 /// <summary> /// 用于将错误信息输出到txt文件 /// </summary> /// <param name="errorMessage">错误详细信息</param> public static void WriteError(string errorMessage) { try { string path = "~/Error/" + DateTime.Today.ToString("yyMMdd") + ".txt"; if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(path))) { File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close(); } using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path))) { w.WriteLine("\r\nLog Entry : "); w.WriteLine("DateTime 【{0}】", DateTime.Now.ToString(CultureInfo.InvariantCulture)); w.WriteLine(errorMessage); w.WriteLine("***********************************************************************************************"); w.Flush(); w.Close(); } } catch (Exception ex) { WriteError(ex.Message); } }
网上大神写的,他分得比较的细:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 public class BaseHandleErrorAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { if (filterContext.ExceptionHandled == true) { HttpException httpExce = filterContext.Exception as HttpException; if (httpExce != null && httpExce.GetHttpCode() != 500)//为什么要特别强调500 因为MVC处理HttpException的时候,如果为500 则会自动将其ExceptionHandled设置为true,那么我们就无法捕获异常 { return; } } Exception exception = filterContext.Exception; if (exception != null) { HttpException httpException = exception as HttpException; if (httpException != null) { //网络错误 filterContext.Controller.ViewBag.UrlRefer = filterContext.HttpContext.Request.UrlReferrer; int DataEroorCode = httpException.GetHttpCode(); if (DataEroorCode == 404) { filterContext.HttpContext.Response.Redirect("~/SysError/404"); } else if (DataEroorCode == 500) { filterContext.HttpContext.Response.Redirect("~/SysError/500"); } else filterContext.HttpContext.Response.Redirect("~/SysError/" + DataEroorCode); //写入日志 记录 filterContext.ExceptionHandled = true;//设置异常已经处理 } else { //编程或者系统错误,不处理,留给HandError处理 } } } }