MVC 中创建自己的异常处理

1.新建类一个类继承 HandleErrorAttribute 类把异常书写到队列中

 1  public class MyExceptionAttribute: HandleErrorAttribute
 2     {
 3         //新建队列
 4          public static Queue<Exception> queueException = new Queue<Exception>();
 5         //重写OnException方法(在程序遇到异常时触发这个方法)
 6         public override void OnException(ExceptionContext filterContext)
 7         {
 8             //访问父类中的异常触发,并把异常信息传过去
 9             base.OnException(filterContext);
10             //入队
11             queueException.Enqueue(filterContext.Exception);
12             //跳转到异常页面
13             filterContext.HttpContext.Response.Redirect("~/Global/Error");
14         }
15     }

2.在 FilterConfig 注册我们自定义的异常处理类

 public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            filters.Add(new MyExceptionAttribute());
        }
    }

3.在Global文件中新增一个线程池专门读取队里的异常数据,写进日志文件(可以根据自己的项目需求,自己决定如何去处理异常)

  ThreadPool.QueueUserWorkItem((a) =>
            {
                while (true)
                {
                    if (MyExceptionAttribute.queueException.Count > 0)
                    {
                        Exception ex = MyExceptionAttribute.queueException.Dequeue();//出队
                        string fileName = DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
                        string start = DateTime.Now.ToString("HH:mm:ss") + "\r\n";
                        string end = "------------------------------------------------------------" + "\r\n";
                        File.AppendAllText(fileLogPath + fileName, start + "ErrorMsg:" + ex.ToString() + "\r\n" + end, System.Text.Encoding.Default);
                    }
                    else
                    {
                        Thread.Sleep(5000);//如果队列中没有数据,休息避免造成CPU的空转.
                    }
                }
            }, fileLogPath);

 

posted @ 2017-06-27 14:19  站在走廊弹吉他  阅读(263)  评论(0编辑  收藏  举报