這篇“springmvc錯誤處理機制是什么”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“springmvc錯誤處理機制是什么”文章吧。
創(chuàng)新互聯(lián)建站一直通過網(wǎng)站建設(shè)和網(wǎng)站營銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實效"的一站式服務(wù),以成都做網(wǎng)站、網(wǎng)站設(shè)計、移動互聯(lián)產(chǎn)品、成都全網(wǎng)營銷服務(wù)為核心業(yè)務(wù)。10多年網(wǎng)站制作的經(jīng)驗,使用新網(wǎng)站建設(shè)技術(shù),全新開發(fā)出的標準網(wǎng)站,不但價格便宜而且實用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡單易用,維護方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。
1、首先要在 golable 文件的 protected void Application_Start()
注冊一個錯誤處理機制。
MVC中自帶一個 過濾器
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
這里面 我們看到這個過濾器
2、其實就是在 app_Start文件夾下面 的 FilterConfig.cs 文件
3、 打開FilterConfig.cs文件
就寫了一個注冊事件。我們看得到 這個是對錯誤處理機制
(當然 ,你們看到的是 HandleErrorAttribute 這個類)
4、所以你們可能覺得奇怪,我們來查看MyExceptionAttribut的定義看一下
繼承了HandleErrorAttribute
這里我把這個類的代碼貼一下
public class MyExceptionAttribute : HandleErrorAttribute { // private static object obj = new object(); public static ConcurrentQueue<Exception> ExceptionQueue = new ConcurrentQueue<Exception>();//定義隊列 /// <summary> /// 在該方法中捕獲異常。 /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); Exception ex = filterContext.Exception;//捕獲異常信息。 //將異常信息寫到隊列中。 ExceptionQueue.Enqueue(ex); //跳轉(zhuǎn)到錯誤頁面. filterContext.HttpContext.Response.Redirect("/Error.html"); } }
主要是定義一個靜態(tài) 隊列 ConcurrentQueue
(當然你也可以用 Queue。但是微軟說 這個ConcurrentQueue 比 Queue 安全。好像是線程安全的,一堆堆的理論,說白了就是用ConcurrentQueue 更安全)
這樣所有的錯誤就都在這個隊列里面了。(就是內(nèi)存)
這樣總不行吧。內(nèi)存 斷電就沒有了的啊。
所以我們要想把資料存到 硬盤中。
5、現(xiàn)在又要在
golable 文件的 protected void Application_Start()
中注冊一個消費線程(這句話后面會解釋,看不懂就繼續(xù))就是在 protected void Application_Start()中加入這些代碼,***放最前面。
內(nèi)容就是線程池開啟一個線程 從剛剛定義的 MyExceptionAttribute的 ExceptionQueue隊列里面取出項來。
將錯誤信息最加到文件后面。如果隊列為空,就線程停留3秒。
string filePath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem((a) => { while (true)//注意:線程不能結(jié)束。后面寫到隊列中的數(shù)據(jù)沒法處理。 { // 這里可以加一條 if (MyExceptionAttribute.ExceptionQueue.Count() > 0) //{ 發(fā)送郵件到管理員} if (MyExceptionAttribute.ExceptionQueue.Count() > 0) { // Exception ex= MyExceptionAttribute.ExceptionQueue.Dequeue();//從隊列中取出數(shù)據(jù). Exception ex = null; bool isResult = MyExceptionAttribute.ExceptionQueue.TryDequeue(out ex); if (ex != null && isResult) { string fullPath = filePath + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; File.AppendAllText(fullPath, ex.ToString()); // ILog logger = LogManager.GetLogger("errorMsg"); // logger.Error(ex.ToString()); } else { Thread.Sleep(3000); } } else { Thread.Sleep(3000);//避免造成CPU的空轉(zhuǎn)。 } } }, filePath);
6、總結(jié)。
這個就是一個生產(chǎn)者消費者的模式。
生產(chǎn)者就是 產(chǎn)生錯誤的源頭。 消費者就是注冊保存日志的方法。
中間有一個倉庫就是 那個靜態(tài)錯誤隊列。
可以看到 系統(tǒng)產(chǎn)生的錯誤臨時存放于內(nèi)存中。然后一個新的線程 去讀寫靜態(tài)錯誤隊列。
正常情況 需要在錯誤隊列里面加一個錯誤隊列數(shù)字大于1000條的時候 發(fā)警告到郵箱的功能。那樣感覺有點問題復雜化了,畢竟這里只是講錯誤處理。
7、log4net 我前面講過的一個開源框架 記錄錯誤很好。
這里提供一個連接 log4net配置方法你可以把那個一起并到這里。那么就會有
把protected void Application_Start()中添加 的代碼
改成。注意是改成:
log4net.Config.XmlConfigurator.Configure(); //開始一個線程,查看異常隊列 string filePath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem((a) => { while (true)//注意:線程不能結(jié)束。后面寫到隊列中的數(shù)據(jù)沒法處理。 { if (MyExceptionAttribute.ExceptionQueue.Count() > 0) { // Exception ex= MyExceptionAttribute.ExceptionQueue.Dequeue();//從隊列中取出數(shù)據(jù). Exception ex = null; bool isResult = MyExceptionAttribute.ExceptionQueue.TryDequeue(out ex); if (ex != null && isResult) { string fullPath = filePath + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; //File.AppendAllText(fullPath, ex.ToString()); ILog logger = LogManager.GetLogger("errorMsg"); logger.Error(ex.ToString()); } else { Thread.Sleep(3000); } } else { Thread.Sleep(3000);//避免造成CPU的空轉(zhuǎn)。 } } }, filePath);
這樣就會按照你的要求把錯誤日志記錄到
app_data文件夾下面。(前提是你有未處理的錯誤 。呵呵)
看到下圖就成功了
以上就是關(guān)于“springmvc錯誤處理機制是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
標題名稱:springmvc錯誤處理機制是什么
分享URL:http://www.rwnh.cn/article26/gdipjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、響應(yīng)式網(wǎng)站、網(wǎng)站導航、外貿(mào)建站、建站公司、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)