如何設計一個全局異常處理器?
首先 樓主從事于
.NET
開發 所以就寫個.NET
的全局異常處理器,哪MVC來說1, 建立MyExecptionAttribute.cs類,寫入如下代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Niunan.MVCShop.Code
{
public class MyExecptionAttribute : HandleErrorAttribute
{
public static Queue<Exception> ExceptionQueue = new Queue<Exception>();//創建隊列.
public override void OnException(ExceptionContext filterContext)
{
//將異常信息入隊.
ExceptionQueue.Enqueue(filterContext.Exception);//將異常信息入隊.
//filterContext.HttpContext.Response.Redirect("/error.html");
base.OnException(filterContext);
}
}
}
2,在Global文件代碼如下:
using Niunan.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;
namespace Niunan.MVCShop
{
// 注意: 有關啟用 IIS6 或 IIS7 經典模式的說明,
// 請訪問 http://;.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalFilters.Filters.Add(new Code.MyExecptionAttribute()); //NET4建立的項目的話則是在APP_Stars/ConfigFilter.cs中
//通過線程開啟一個線程,然后不停的從隊列中或數據
string filePath = Server.MapPath("/Log/");
ThreadPool.QueueUserWorkItem(o =>
{
while (true)
{
try
{
if (Code.MyExecptionAttribute.ExceptionQueue.Count > 0)
{
Exception ex = Code.MyExecptionAttribute.ExceptionQueue.Dequeue();//從隊列中拿出數據
if (ex != null)
{
Tool.TxtLog(ex.ToString(), filePath + DateTime.Now.ToString("yyyyMMdd")+".txt");
}
else
{
Thread.Sleep(30);
}
}
else
{
Thread.Sleep(30);//避免了CPU空轉。
}
}
catch (Exception ex)
{
Code.MyExecptionAttribute.ExceptionQueue.Enqueue(ex);
}
}
}, filePath);
}
}
}