ASP.NET MVC使用Exception过滤器处理异常

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pan_junbiao/article/details/84565988

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

猜你喜欢

转载自blog.csdn.net/pan_junbiao/article/details/84565988