關(guān)于面向切面編程的部分內(nèi)容-錯誤處理機制(共7頁)_第1頁
關(guān)于面向切面編程的部分內(nèi)容-錯誤處理機制(共7頁)_第2頁
關(guān)于面向切面編程的部分內(nèi)容-錯誤處理機制(共7頁)_第3頁
關(guān)于面向切面編程的部分內(nèi)容-錯誤處理機制(共7頁)_第4頁
關(guān)于面向切面編程的部分內(nèi)容-錯誤處理機制(共7頁)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、關(guān)于面向(min xin)切面編程的部分內(nèi)容-錯誤處理機制(jzh)錯誤處理機制(jzh)。面對多個web服務(wù)器,多線程處理,我們想把錯誤信息記錄到一個txt文檔中。但是把錯誤信息寫到內(nèi)存是很快。寫到硬盤上就有一堆的問題。比如說讀寫慢、并發(fā)問題。今天我們就利用這個實現(xiàn)錯誤處理 此文以MVC為例1、首先要在 golable 文件的 protected void Application_Start()注冊一個錯誤處理機制。MVC中自帶一個 過濾器FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);這里面 我們看到這個過濾器2、其實就是

2、在 app_Start文件夾下面 的 FilterConfig.cs 文件3、 打開(d ki)FilterConfig.cs文件(wnjin)就寫了一個注冊事件。我們看得到 這個(zh ge)是對錯誤處理機制(當(dāng)然 ,你們看到的是 HandleErrorAttribute 這個類)4、所以你們可能覺得奇怪,我們來查看MyExceptionAttribut的定義看一下繼承了HandleErrorAttribute這里我把這個類的代碼貼一下publicclassMyExceptionAttribute:HandleErrorAttribute/privatestaticobjectobj=new

3、object();publicstaticConcurrentQueueExceptionQueue=newConcurrentQueue();/定義隊列/在該方法中捕獲異常。/publicoverridevoidOnException(ExceptionContextfilterContext)base.OnException(filterContext);Exceptionex=filterContext.Exception;/捕獲(bhu)異常信息。/將異常信息(xnx)寫到隊列中。ExceptionQueue.Enqueue(ex);/跳轉(zhuǎn)到錯誤(cuw)頁面.filterContex

4、t.HttpContext.Response.Redirect(/Error.html);主要是定義一個靜態(tài) 隊列 ConcurrentQueue(當(dāng)然你也可以用 Queue。但是微軟說 這個ConcurrentQueue 比 Queue 安全。好像是線程安全的,一堆堆的理論,說白了就是用ConcurrentQueue 更安全)這樣所有的錯誤就都在這個隊列里面了。(就是內(nèi)存)這樣總不行吧。內(nèi)存 斷電就沒有了的啊。所以我們要想把資料存到 硬盤中。5、現(xiàn)在又要在 golable 文件的 protected void Application_Start()中注冊一個消費線程(這句話后面會解釋,看不懂

5、就繼續(xù))就是在 protected void Application_Start()中加入這些代碼,最好放最前面。內(nèi)容就是線程池開啟一個線程 從剛剛定義的 MyExceptionAttribute的 ExceptionQueue隊列里面取出項來。將錯誤信息最加到文件后面。如果(rgu)隊列為空,就線程停留3秒。stringfilePath=Server.MapPath(/Log/);ThreadPool.QueueUserWorkItem(a)=while(true)/注意(zh y):線程不能結(jié)束。后面寫到隊列中的數(shù)據(jù)沒法處理。/這里可以(ky)加一條if(MyExceptionAttrib

6、ute.ExceptionQueue.Count()0)/發(fā)送郵件到管理員if(MyExceptionAttribute.ExceptionQueue.Count()0)/Exceptionex=MyExceptionAttribute.ExceptionQueue.Dequeue();/從隊列中取出數(shù)據(jù).Exceptionex=null;boolisResult=MyExceptionAttribute.ExceptionQueue.TryDequeue(outex);if(ex!=null&isResult)stringfullPath=filePath+DateTime.Now.ToSt

7、ring(yyyy-MM-dd)+.txt;File.AppendAllText(fullPath,ex.ToString();/ILoglogger=LogManager.GetLogger(errorMsg);/logger.Error(ex.ToString();elseThread.Sleep(3000);elseThread.Sleep(3000);/避免(bmin)造成CPU的空轉(zhuǎn)(kngzhun)。,filePath);6、總結(jié)(zngji)。這個就是一個生產(chǎn)者消費者的模式。生產(chǎn)者就是 產(chǎn)生錯誤的源頭。 消費者就是注冊保存日志的方法。中間有一個倉庫就是 那個靜態(tài)錯誤隊列??梢钥吹?/p>

8、 系統(tǒng)產(chǎn)生的錯誤臨時存放于內(nèi)存中。然后一個新的線程 去讀寫靜態(tài)錯誤隊列。正常情況 需要在錯誤隊列里面加一個錯誤隊列數(shù)字大于1000條的時候 發(fā)警告到郵箱的功能。那樣感覺有點問題復(fù)雜化了,畢竟這里只是講錯誤處理。7、log4net 我前面講過的一個開源框架 記錄錯誤很好。這里提供一個連接 HYPERLINK /jixinyu12345/p/4859301.html log4net配置方法你可以把那個一起并到這里。那么就會有把protected void Application_Start()中添加 的代碼改成。注意是改成:log4net.Config.XmlConfigurator.Config

9、ure();/開始一個線程,查看異常隊列stringfilePath=Server.MapPath(/Log/);ThreadPool.QueueUserWorkItem(a)=while(true)/注意:線程不能結(jié)束。后面(hu mian)寫到隊列中的數(shù)據(jù)沒法處理。if(MyExceptionAttribute.ExceptionQueue.Count()0)/Exceptionex=MyExceptionAttribute.ExceptionQueue.Dequeue();/從隊列(duli)中取出數(shù)據(jù).Exceptionex=null;boolisResult=MyExceptionA

10、ttribute.ExceptionQueue.TryDequeue(outex);if(ex!=null&isResult)stringfullPath=filePath+DateTime.Now.ToString(yyyy-MM-dd)+.txt;/File.AppendAllText(fullPath,ex.ToString();ILoglogger=LogManager.GetLogger(errorMsg);logger.Error(ex.ToString();elseThread.Sleep(3000);elseThread.Sleep(3000);/避免(bmin)造成CPU的空

11、轉(zhuǎn)(kngzhun)。,filePath);這樣(zhyng)就會按照你的要求把錯誤日志記錄到app_data文件夾下面。(前提是你有未處理的錯誤 。呵呵)看到下圖就成功了題外話(沒有就自己創(chuàng)一個 var s=3/0;這樣就可以了。)【編輯推薦】 HYPERLINK /art/201506/478685.htm t _blank Java 垃圾回收機制概念梳理 HYPERLINK /art/201506/481224.htm t _blank Java 9許愿清單:請賜予我們更理想的垃圾回收機制 HYPERLINK /art/201508/487231.htm t _blank 深入分析Java線程中斷機制 HYPERLINK /

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論