MVC项目中异常处理
一、异常处理,目的是为了不把一些数据相关的报错信息展示给用户
1.在models中新建一个MyExceptionAttribute类,用来处理异常,并且将异常加载进入队列中
using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Web; using System.Web.Mvc; namespace Models { public class MyExceptionAttribute : HandleErrorAttribute {
//新建一个队列Queue类型,用来存放异常信息,队列的原则是先进先出 public static Queue<Exception> ExecptionQueue = new Queue<Exception>(); /// <summary> /// 可以捕获异常数据 /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { //捕获异常 base.OnException(filterContext); //接收异常 Exception ex = filterContext.Exception; //写到队列,把数据插入到队列中 ExecptionQueue.Enqueue(ex); //跳转到错误页面. filterContext.HttpContext.Response.Redirect("/Error.html"); } } }
2. 在Global.asax文件中开启线程,捕获异常,因为该文件是最初启动的,并且线程一直启动。然后将启动的线程日志放在log文件夹中。15行以后是关键代码
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明, // 请访问 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : SpringMvcApplication //System.Web.HttpApplication { //该文件只要文件启动就会自动启动,所以需要把处理异常的线程放置在该文件中 protected void Application_Start() { log4net.Config.XmlConfigurator.Configure();//读取了配置文件中关于Log4Net配置信息. IndexManager.GetInstance().StartThread();//开始线程扫描LuceneNet对应的数据队列。 AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //开启一个线程,扫描异常信息队列。 //Server.MapPath 拿到一个文件夹的物理路径 string filePath = Server.MapPath("/Log/"); //开启线程池 需要传递一个匿名函数,需要传递一个方法:值执行线程的方法或者函数 ThreadPool.QueueUserWorkItem((a) => { while (true) //设置线程一直在执行,从开启到结束 { //判断一下队列中是否有数据 if (MyExceptionAttribute.ExecptionQueue.Count() > 0) { // 出队,并且用一个异常类型的去接收该值 Exception ex=MyExceptionAttribute.ExecptionQueue.Dequeue(); if (ex != null) { //将异常信息写到日志文件中。 //string fileName = DateTime.Now.ToString("yyyy-MM-dd"); //新建一个文件名 //向文件中添加文件 文件名,数据,编码格式 //File.AppendAllText(filePath+fileName+".txt",ex.ToString(),System.Text.Encoding.UTF8); ILog logger = LogManager.GetLogger("errorMsg"); logger.Error(ex.ToString()); } else { //如果队列中没有数据,休息 Thread.Sleep(3000); } } else { //如果队列中没有数据,休息 Thread.Sleep(3000); } } },filePath); } //异常处理的过滤器。 }
3. 关键点,修改App_Start文件夹下的FilterConfig文件
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { // filters.Add(new HandleErrorAttribute()); filters.Add(new MyExceptionAttribute()); //注册自己的异常文件 } }