1. 程式人生 > >錯誤處理~跳轉頁面

錯誤處理~跳轉頁面

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);
            }

        }

    }

}

錯誤處理~跳轉頁面