ASP.NET MVC使用自带的异常过滤器处理异常

创建自己的异常处理类

新建ASP.NET MVC 项目,创建自己的异常处理类,继承HandleErrorAttribute。
public class MyException: HandleErrorAttribute {
        public override void OnException(ExceptionContext filterContext) {
            base.OnException(filterContext);
            Exception ex = filterContext.Exception;
        }
    }

使用队列记录异常信息

当多个线程同时操作一个文件时,会造成文件的并发,所以我们利用队列先进先出的特性把错误信息写入到队列当中。当我们要处理队列里面的数据时,开启一个线程去读取队列里面的数据,然后把这些数据写到文件中。

public class MyException: HandleErrorAttribute {
       /// 
       /// 使用静态类避免每次调用的都进行实例化,创建新的对象
       /// 
       public static Queue exception = new Queue();
       /// 
       /// 捕获数据异常
       /// 
       /// 
       public override void OnException(ExceptionContext filterContext) {
           base.OnException(filterContext);
           Exception ex = filterContext.Exception;
           //错误信息进入队列
           exception.Enqueue(ex);
           //跳转到错误页面!
           filterContext.HttpContext.Response.Redirect("/Error.html");
       }
   }

注册自己的异常处理类

在FilterConfig中注册自己的异常处理类,当程序有异常的时候会进行处理我们自己定义的异常处理类。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
    //filters.Add(new HandleErrorAttribute());
    //注册自己的异常处理类
    filters.Add(new MyException());

添加一个控制器

public class TestExceptionController : Controller
    {
        // GET: TestException
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult ShowResult() {
            int a = 2;
            int b = 0;
            int c = a / b;
            return Content(c.ToString());
        }
    }

在global文件中处理异常信息

在global文件开启一个线程,每次扫描异常信息队列,有数据写入到文件,没有休息一段时间。

string filePath = Server.MapPath("/Log/");
// 从线程池里拿个线程
ThreadPool.QueueUserWorkItem(a=> {
               //一直循环线检查里面有没有数据
               while (true) {
                   if (MyException.exception.Count() > 0) {
                       //出列
                       Exception ex = MyException.exception.Dequeue();
                       if (ex != null) {
                           string filename = DateTime.Now.ToString("yyyy-MM-dd");
                           //写入文件
                           File.AppendAllText(filePath + filename+".txt",ex.ToString(),System.Text.Encoding.UTF8);
                       }
                       else {
                           //如果队列没数据休息,避免一直开启线程
                           Thread.Sleep(3000);
                       }
                   }
                   else {
                       //如果队列没数据休息,避免一直开启线程
                       Thread.Sleep(3000);
                   }
               }
           },filePath);

你可能感兴趣的:(asp.net,c#,过滤器,mvc,c#)