1. 程式人生 > >ASP.NET MVC使用Exception過濾器處理異常

ASP.NET MVC使用Exception過濾器處理異常

ASP.NET MVC使用Exception過濾器處理異常,Exception過濾器只在另一個過濾器、動作方法、動作結果彈出異常時執行。

示例:使用Exception過濾器處理異常資訊。

建立MyHandleErrorAttribute類,繼承HandleErrorAttribute類:

using System;
using System.IO;
using System.Text;
using System.Web.Mvc;

namespace MvcApp.Filter
{
    /// <summary>
    /// 異常處理過濾器
    /// </summary>
    public class MyHandleErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        { 
            //1、獲取異常物件
            Exception ex = filterContext.Exception;

            //2、獲取請求的類名和方法名
            string strController = filterContext.RouteData.Values["controller"].ToString();
            string strAction = filterContext.RouteData.Values["action"].ToString();

            //3、記錄異常日誌
            string errMsg = String.Format("控制器:{0};Action:{1};異常資訊:{2};", strController, strAction, ex.ToString());
            WriteLog(errMsg);

            //4、重定向友好頁面
            filterContext.Result = new RedirectResult("~/error.html");

            //5、標記異常已經處理完畢
            filterContext.ExceptionHandled = true;

            base.OnException(filterContext);
        }

        /// <summary>
        /// 寫入日誌
        /// </summary>
        public void WriteLog(string message)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory + "/MyLog.txt";
            using (StreamWriter sw = new StreamWriter(path, true, Encoding.Default))
            {
                sw.Flush();
                sw.WriteLine("時間:" + DateTime.Now);
                sw.WriteLine("內容:" + message);
                sw.WriteLine("-------------------------");
            }
        }

    }
}

在Action上面新增MyHandleError過濾器:

[MyHandleError]
public ActionResult GetErr()
{
    int a = 0;
    int b = 1 / a;
    return View();
}

建立異常錯誤友好提示頁面error.html。

<body>
    自定義錯誤頁面
</body>

執行會自動跳轉到error.html頁面。

如果頁面沒有跳轉,就需要去Web.config配置檔案中的<system.web>節點下面新增如下配置節點,開啟自定義錯誤:

<customErrors mode="On"></customErrors>

通常這樣的異常處理是放在全域性過濾器上面的,只要任意Action方法報錯就會執行MyHandleError過濾器中的程式碼。

修改App_Start目錄下面的FilterConfig類:

using System.Web;
using System.Web.Mvc;
using MvcApp.Filter;

namespace MvcApp
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());

            //新增全域性異常處理過濾器
            filters.Add(new MyHandleErrorAttribute());
        }
    }
}

Global.asax下的程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace MvcApp
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}