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