溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

學一學MVC的過濾器--異常處理

發(fā)布時間:2020-07-04 21:25:52 來源:網(wǎng)絡 閱讀:460 作者:fanpan26 欄目:編程語言


   學習MVC不久,看到公司的項目里有日志記錄功能,出于自己的原因一直沒有看看是如何實現(xiàn)的,后來看了個學習視頻和一些博文,才發(fā)現(xiàn)采用MVC里的過濾器 Filter 可以很容易實現(xiàn),比較常見也很容易的做法就是繼承  IActionFilter,IExceptionFilter 接口,然后實現(xiàn)里面的方法即可。

   下面看一下代碼,這是公司項目的一段代碼,主要是將項目中出現(xiàn)的異常記錄在 每天的txt日志文件里。當然實現(xiàn)日志的方法有很多種,這個只是其中一種,如果出現(xiàn)了IO錯誤,這種方法就不好說啦。

 public class AppHandleErrorAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            //System.Web.Mvc.ExceptionContext

            if (!filterContext.ExceptionHandled )
            {
                //如果已經(jīng)自己寫了try  catch,那么可不用記錄日志
                var ds = (System.Web.Configuration.CompilationSection)System.Configuration.ConfigurationManager.GetSection("system.web/compilation");
                if (ds.Debug)
                {
                   //創(chuàng)建相關文件,并寫入異常記錄
                    var dir = System.Web.HttpContext.Current.Server.MapPath("~") + @"\log\";
                    if (!System.IO.Directory.Exists(dir)) { System.IO.Directory.CreateDirectory(dir); }
                    var path = dir + DateTime.Now.ToString("yyyyMMdd") + "_site.txt";
                    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(path, true))
                    {
                        var dataException = filterContext.Exception;
                        var message = dataException.Message;

                        sw.WriteLine();
                        sw.WriteLine("-----------------"+DateTime.Now.ToString("HH:mm:ss") + "-----------------");
                        sw.WriteLine(message);
                        sw.WriteLine("Message:" + dataException.Message);
                        sw.WriteLine("StackTrace:" + dataException.StackTrace.ToString());
                        sw.Flush();
                        sw.Close();
                    }
                }
                filterContext.ExceptionHandled = true;//異常已經(jīng)處理,程序可以不用在處理一遍
                //var link = new UrlHelper(filterContext.RequestContext).Action("Index", "CustomError");
                //filterContext.Result = new RedirectResult(link);

                //filterContext.Result = new ContentResult() { Content = "<center>網(wǎng)絡連接異常,請<a href='javascript:;' onclick='location.reload()'>刷新</a>重試</cener>", ContentType = "text/html" };
                filterContext.Result = new ContentResult() { Content = "<center>當前網(wǎng)絡發(fā)生故障,請刷新頁面重試(點擊<a href='javascript:;' onclick='location.reload()'>刷新</a>)</cener>", ContentType = "text/html" };

            }



        }
    }

 上邊這段代碼很簡單,如果只是單純記錄某一個Action的Exception,那么調用方法如下

[AppHandleError]
public ActionResult  xxAction()
{
    return View();
}

 如果是全局的設置,那么就要在項目的Global.ascx 里面加上這么一段話,注冊 自定義的Filter

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {           
           filters.Add(new AppHandleErrorAttribute());
        }
        
        protected void Application_Start()
        {
           //  AreaRegistration.RegisterAllAreas();
           //  調用注冊方法
               RegisterGlobalFilters(GlobalFilters.Filters);
           //  RegisterRoutes(RouteTable.Routes);
        }

下面進入實戰(zhàn)Demo


1.編寫AppHandleErrorAttribute,代碼已經(jīng)貼出

2.在需要記錄異常的Action上添加這個屬性

        [AppHandleError]
        public ActionResult Index()
        {
            throw new Exception("記錄日志的內容");
            return View();
        }

先看一下沒加 這個過濾器的頁面,很明顯黃頁:

學一學MVC的過濾器--異常處理

下面是添加過濾器的運行效果:學一學MVC的過濾器--異常處理

那么這個頁面就是錯誤處理頁了,我這里是輸出的內容,也可以將filterContext.Result 設置成為ViewResult,或者跳轉到新的錯誤頁面。再看一下日志記錄:學一學MVC的過濾器--異常處理

可以看到,異常日志已經(jīng)添加到相關的txt日志文件里面。


說明:如果在Global里面增加了項目配置,那么在Action上就不用標注這個過濾器,所有未經(jīng)過Try  catch的異常都可以捕獲處理,代碼,圖略。


所以,try  catch不是什么情況下都適用,如果不影響重要業(yè)務的情況下,可以使用try  catch來處理業(yè)務,如果是比較重大的錯誤,就需要日志記錄了。今天就到這里吧,第一次寫這種博文,也算是自己的學習感想。有不足或者更好的方法歡迎批評指出。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI