【MVC】錯誤頁面設定和錯誤資訊記錄
阿新 • • 發佈:2019-01-24
一、自定義錯誤頁面
有些時候,我們想使用自定義的錯誤頁面,該怎麼處理那。
翻頁其他大牛寫的部落格,看到有這種方式,自定義屬性Class繼承FileterAttribute,
重寫OnException方法,程式碼如下
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、記錄錯誤資訊
/// <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); } }
網上大神寫的,他分得比較的細:
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處理 } } } }