springmvc錯(cuò)誤處理機(jī)制是什么

這篇“springmvc錯(cuò)誤處理機(jī)制是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“springmvc錯(cuò)誤處理機(jī)制是什么”文章吧。

創(chuàng)新互聯(lián)建站一直通過(guò)網(wǎng)站建設(shè)和網(wǎng)站營(yíng)銷(xiāo)幫助企業(yè)獲得更多客戶(hù)資源。 以"深度挖掘,量身打造,注重實(shí)效"的一站式服務(wù),以成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、移動(dòng)互聯(lián)產(chǎn)品、成都全網(wǎng)營(yíng)銷(xiāo)服務(wù)為核心業(yè)務(wù)。10多年網(wǎng)站制作的經(jīng)驗(yàn),使用新網(wǎng)站建設(shè)技術(shù),全新開(kāi)發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價(jià)格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡(jiǎn)單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。

1、首先要在  golable  文件的  protected void Application_Start()


注冊(cè)一個(gè)錯(cuò)誤處理機(jī)制。

MVC中自帶一個(gè)  過(guò)濾器

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

springmvc錯(cuò)誤處理機(jī)制是什么

這里面 我們看到這個(gè)過(guò)濾器

2、其實(shí)就是在 app_Start文件夾下面 的 FilterConfig.cs 文件

springmvc錯(cuò)誤處理機(jī)制是什么

3、 打開(kāi)FilterConfig.cs文件

就寫(xiě)了一個(gè)注冊(cè)事件。我們看得到 這個(gè)是對(duì)錯(cuò)誤處理機(jī)制

springmvc錯(cuò)誤處理機(jī)制是什么

(當(dāng)然 ,你們看到的是  HandleErrorAttribute 這個(gè)類(lèi))

4、所以你們可能覺(jué)得奇怪,我們來(lái)查看MyExceptionAttribut的定義看一下

springmvc錯(cuò)誤處理機(jī)制是什么

繼承了HandleErrorAttribute

這里我把這個(gè)類(lèi)的代碼貼一下


public class MyExceptionAttribute : HandleErrorAttribute     {         //  private static object obj = new object();         public static ConcurrentQueue<Exception> ExceptionQueue = new ConcurrentQueue<Exception>();//定義隊(duì)列          /// <summary>         /// 在該方法中捕獲異常。         /// </summary>         /// <param name="filterContext"></param>         public override void OnException(ExceptionContext filterContext)         {              base.OnException(filterContext);             Exception ex = filterContext.Exception;//捕獲異常信息。             //將異常信息寫(xiě)到隊(duì)列中。             ExceptionQueue.Enqueue(ex);             //跳轉(zhuǎn)到錯(cuò)誤頁(yè)面.             filterContext.HttpContext.Response.Redirect("/Error.html");                      }     }

主要是定義一個(gè)靜態(tài) 隊(duì)列  ConcurrentQueue

(當(dāng)然你也可以用 Queue。但是微軟說(shuō) 這個(gè)ConcurrentQueue 比 Queue  安全。好像是線(xiàn)程安全的,一堆堆的理論,說(shuō)白了就是用ConcurrentQueue 更安全)

這樣所有的錯(cuò)誤就都在這個(gè)隊(duì)列里面了。(就是內(nèi)存)

這樣總不行吧。內(nèi)存 斷電就沒(méi)有了的啊。

所以我們要想把資料存到 硬盤(pán)中。

5、現(xiàn)在又要在

golable  文件的  protected void Application_Start()


中注冊(cè)一個(gè)消費(fèi)線(xiàn)程(這句話(huà)后面會(huì)解釋?zhuān)床欢屠^續(xù))就是在 protected void Application_Start()中加入這些代碼,***放最前面。

內(nèi)容就是線(xiàn)程池開(kāi)啟一個(gè)線(xiàn)程 從剛剛定義的 MyExceptionAttribute的 ExceptionQueue隊(duì)列里面取出項(xiàng)來(lái)。

將錯(cuò)誤信息最加到文件后面。如果隊(duì)列為空,就線(xiàn)程停留3秒。


string filePath = Server.MapPath("/Log/");             ThreadPool.QueueUserWorkItem((a) =>             {                  while (true)//注意:線(xiàn)程不能結(jié)束。后面寫(xiě)到隊(duì)列中的數(shù)據(jù)沒(méi)法處理。                 {      // 這里可以加一條   if (MyExceptionAttribute.ExceptionQueue.Count() > 0) //{  發(fā)送郵件到管理員}                     if (MyExceptionAttribute.ExceptionQueue.Count() > 0)                     {                         // Exception ex= MyExceptionAttribute.ExceptionQueue.Dequeue();//從隊(duì)列中取出數(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é)。

這個(gè)就是一個(gè)生產(chǎn)者消費(fèi)者的模式。

生產(chǎn)者就是 產(chǎn)生錯(cuò)誤的源頭。 消費(fèi)者就是注冊(cè)保存日志的方法。

中間有一個(gè)倉(cāng)庫(kù)就是    那個(gè)靜態(tài)錯(cuò)誤隊(duì)列。

可以看到 系統(tǒng)產(chǎn)生的錯(cuò)誤臨時(shí)存放于內(nèi)存中。然后一個(gè)新的線(xiàn)程 去讀寫(xiě)靜態(tài)錯(cuò)誤隊(duì)列。

正常情況 需要在錯(cuò)誤隊(duì)列里面加一個(gè)錯(cuò)誤隊(duì)列數(shù)字大于1000條的時(shí)候  發(fā)警告到郵箱的功能。那樣感覺(jué)有點(diǎn)問(wèn)題復(fù)雜化了,畢竟這里只是講錯(cuò)誤處理。

7、log4net 我前面講過(guò)的一個(gè)開(kāi)源框架 記錄錯(cuò)誤很好。

這里提供一個(gè)連接    log4net配置方法你可以把那個(gè)一起并到這里。那么就會(huì)有

把protected void Application_Start()中添加 的代碼

改成。注意是改成:

log4net.Config.XmlConfigurator.Configure();             //開(kāi)始一個(gè)線(xiàn)程,查看異常隊(duì)列             string filePath = Server.MapPath("/Log/");             ThreadPool.QueueUserWorkItem((a) =>             {                  while (true)//注意:線(xiàn)程不能結(jié)束。后面寫(xiě)到隊(duì)列中的數(shù)據(jù)沒(méi)法處理。                 {                     if (MyExceptionAttribute.ExceptionQueue.Count() > 0)                     {                         // Exception ex= MyExceptionAttribute.ExceptionQueue.Dequeue();//從隊(duì)列中取出數(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);

這樣就會(huì)按照你的要求把錯(cuò)誤日志記錄到

app_data文件夾下面。(前提是你有未處理的錯(cuò)誤 。呵呵)

看到下圖就成功了

springmvc錯(cuò)誤處理機(jī)制是什么

以上就是關(guān)于“springmvc錯(cuò)誤處理機(jī)制是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱(chēng):springmvc錯(cuò)誤處理機(jī)制是什么
分享URL:http://muchs.cn/article26/gdipjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)響應(yīng)式網(wǎng)站、網(wǎng)站導(dǎo)航、外貿(mào)建站建站公司、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)