錯誤處理~跳轉頁面
阿新 • • 發佈:2017-10-04
ace 是否 tom spa env 時間 錯誤 data system
我們經常遇到很多網站在出錯時不報黃屏,而是跳轉到了一個錯誤頁面,那麽這個效果如何實現的呢?請看下面→_→
第一種實現:
1.首先在Global裏面將FilterConfig轉到定義將filters.Add(new HandleErrorAttribute());這段代碼註釋掉
2.在WebConfig裏面進行配置
<customErrors mode="On" defaultRedirect="~/Home/Error1"> <error statusCode="404" redirect="~/Home/Error2"/> <error statusCode="500" redirect="~/Home/Error3"/> </customErrors>
第二種實現:
1.首先在Global裏面將FilterConfig轉到定義將filters.Add(new HandleErrorAttribute());這段代碼改為 filters.Add(new MyExpressionAttribute());
2.添加自定義實現:(PS:這個跳轉的錯誤頁路徑一定要對,不然會因導致404錯誤進而實現不了想要的結果)
public class MyExpressionAttribute : HandleErrorAttribute {public override void OnException(ExceptionContext filterContext) { //1.錯誤處理(寫日誌) string errorStr = filterContext.Exception.StackTrace;//獲取錯誤信息 //2.跳轉錯誤頁 filterContext.HttpContext.Response.Redirect("~/Home/Error", true);//調到自己定義的Error.html頁 } }
第三種實現: (通過Application_Error實現)
1.在Global.asax.cs實現如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.SessionState; using System.Text; using net.itcast.cn.ashx.crud.utiliy; namespace 請求流程 { public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { } protected void Session_Start(object sender, EventArgs e) { } protected void Application_BeginRequest(object sender, EventArgs e) { } protected void Application_AuthenticateRequest(object sender, EventArgs e) { } //頁面出錯時執行的方法 protected void Application_Error(object sender, EventArgs e) { //1.獲取最後一次出錯的錯誤對象 Exception exMsg = Context.Server.GetLastError(); //2.根據錯誤對象生成錯誤消息 StringBuilder sbLogText = new StringBuilder(); //寫入時間 sbLogText.AppendLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); //寫入具體的錯誤信息 sbLogText.AppendLine("錯誤消息:"+exMsg.Message); sbLogText.AppendLine("錯誤詳細信息:" + exMsg.StackTrace); if (exMsg.InnerException != null) { sbLogText.AppendLine("=============內部異常信息============"+exMsg.InnerException.Message); sbLogText.AppendLine(Environment.NewLine); } sbLogText.AppendLine("-------------出錯客戶端IP:" + Context.Request.UserHostAddress + "-----------"); //3.把錯誤的字符串傳遞給對應的記錄日誌的方法 LogHelper.LogEnqueue(sbLogText.ToString()); Context.Response.Redirect("~/MyErrorPage.aspx");//跳轉到錯誤界面 } protected void Session_End(object sender, EventArgs e) { } protected void Application_End(object sender, EventArgs e) { } } }
上面用到的LogHelper實現如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Web; using System.IO; namespace net.itcast.cn.ashx.crud.utiliy { //記錄日誌的方法 public static class LogHelper { //聲明一個靜態的隊列集合 private static Queue<string> _queue; //靜態構造函數 //靜態構造函數只在第一次使用靜態類之前執行一次。 static LogHelper() { //new 一個隊列集合對象 _queue = new Queue<string>(); //獲取HttpContext上下文對象 HttpContext context = HttpContext.Current; //獲取日誌文件的路徑 string path = context.Request.MapPath("~/App_Data/");//記錄日誌的目錄 //開啟一個新的線程,這個線程的作用就是把_queue中的錯誤信息不斷的寫入到日誌文件中 Thread tWriteLog = new Thread(new ThreadStart(() => { while (true) { bool isQueueEmpty = false;//標記當前隊列中的信息是否為空 string exMsg = string.Empty; //1.判斷隊列中是否有錯誤信息 lock ("net.itcast.cn.heima13net.dibazu.ays_hfx") { //判斷隊列中是否有錯誤信息 if (_queue.Count > 0) { //則從隊列中獲取一條錯誤信息 exMsg = _queue.Dequeue(); } else { isQueueEmpty = true;//標記隊列中為空 } } if (isQueueEmpty) { Thread.Sleep(100); } else if (exMsg != null) { //將錯誤信息寫入到日誌文件中。 string logFilePath = Path.Combine(path, DateTime.Now.ToString("yyyy-MM-dd") + ".txt"); //1.獲取日誌文件要保存的路徑 File.AppendAllText(logFilePath, exMsg); } } })); tWriteLog.IsBackground = true; tWriteLog.Start(); } // 向隊列中寫入數據 public static void LogEnqueue(string logTxt) { lock ("net.itcast.cn.heima13net.dibazu.ays_hfx") { //把錯誤信息入隊! _queue.Enqueue(logTxt); } } } }
錯誤處理~跳轉頁面