|
異常捕捉、處理是每個(gè)項(xiàng)目中必不可少的一部分,利用反射和XML配置技術(shù)實(shí)現(xiàn)一個(gè)通用的、靈活的、可配置的、高度可自擴(kuò)展的異常處理框架對(duì)項(xiàng)目的整體健壯性以及異常處理效率都是非常重要的。通用異常處理框架中需要提供配置信息的支持以及統(tǒng)一的異常處理類(lèi)和異常日志記錄類(lèi)管理,并允許用戶(hù)以插件形式擴(kuò)展自定義的異常處理或日志記錄方式。
一、問(wèn)題的提出
由于異常處理在項(xiàng)目中的普遍性,我們會(huì)很自然的想到是否可以對(duì)異常處理模塊進(jìn)行提取為公用模塊,加強(qiáng)項(xiàng)目間的復(fù)用,提高項(xiàng)目的開(kāi)發(fā)進(jìn)度。并且在異常處理中,因?yàn)闆](méi)有良好的異常處理系統(tǒng)可能造成一些問(wèn)題:
- 若異常處理方式不當(dāng),容易造成比較嚴(yán)重的性能問(wèn)題。
- 在項(xiàng)目開(kāi)發(fā)階段,開(kāi)發(fā)人員需要得到完整的異常錯(cuò)誤信息方便分析BUG;在項(xiàng)目發(fā)布階段,用戶(hù)希望看到的是比較友好的錯(cuò)誤信息。一個(gè)良好的異常處理系統(tǒng)應(yīng)能夠通過(guò)簡(jiǎn)單的配置方便的達(dá)到這樣的效果
- 異常處理系統(tǒng)應(yīng)該能夠提供足夠的信息方便開(kāi)發(fā)人員對(duì)BUG異常的準(zhǔn)確定位,減少查找BUG產(chǎn)生原因的時(shí)間。(該問(wèn)題在自己的項(xiàng)目中有過(guò)深刻教訓(xùn):因項(xiàng)目中異常信息的不準(zhǔn)確,導(dǎo)致一個(gè)BUG消耗大量人力時(shí)間)
- 一個(gè)項(xiàng)目中各層對(duì)異常處理的方式不同,可能會(huì)不同的層編寫(xiě)不同的代碼,造成代碼使用麻煩以及復(fù)用性低,若需修改,可能改動(dòng)較大。(例如PDM項(xiàng)目中,除UI層外,都是對(duì)異常進(jìn)行包裝后拋給上一層捕捉;而UI層需要處理記錄異常,并反饋給用戶(hù);即便是UI層也應(yīng)WebUI和WinUI采用的不同的方式實(shí)現(xiàn),提供給項(xiàng)目的接口也都有一定區(qū)別,增加了編碼的復(fù)雜程度)
- 異常報(bào)告信息沒(méi)有統(tǒng)一管理。很多項(xiàng)目中報(bào)告給用戶(hù)的錯(cuò)誤消息,都是程序員在開(kāi)發(fā)中自己編寫(xiě)的,對(duì)用戶(hù)而言,常常不是有效的友好的提示信息。集中管理后可以由BA來(lái)進(jìn)行錯(cuò)誤信息的整理,改善用戶(hù)體驗(yàn)。
- 異常記錄方式可能會(huì)在不同環(huán)境有不同的處理,應(yīng)該能通過(guò)配置文件簡(jiǎn)單的實(shí)現(xiàn),而不必每次為不同的應(yīng)用編寫(xiě)代碼。
- 要把異常系統(tǒng)做成一個(gè)通用的框架,存在一個(gè)比較大的挑戰(zhàn):不同的項(xiàng)目可能因項(xiàng)目的整體構(gòu)架不同,對(duì)異常處理方式會(huì)有不同的需求,如何保持通用異常處理框架的靈活性的同時(shí)實(shí)現(xiàn)復(fù)用以及可配置性。
二、解決思路
為了最大程度實(shí)現(xiàn)異常處理框架的通用性、可擴(kuò)展性以及可配置性,采用配置文件結(jié)合動(dòng)態(tài)加載插件的方式:框架提供接口,由不同項(xiàng)目根據(jù)自己的需要實(shí)現(xiàn)接口,完成對(duì)異常的處理,以及異常日志的記錄;而框架再根據(jù)配置信息決定異常處理在不同的情況下的處理策略,并通過(guò)調(diào)用用戶(hù)實(shí)現(xiàn)的接口來(lái)完成異常處理過(guò)程。
整個(gè)異常處理過(guò)程對(duì)項(xiàng)目調(diào)用高度封裝,項(xiàng)目中不論任何地方,只需調(diào)用一個(gè)唯一的接口,框架就會(huì)根據(jù)配置信息執(zhí)行需要的異常處理。
三、實(shí)踐情況
整體結(jié)構(gòu)
框架主要由ExManagement.Config、ExManagement.Interface、ExManagement.MessageHandler以及ExManagement構(gòu)成。如圖:三-1
- ExManagement.Config:用于從配置文件中獲取配置信息,并將配置信息轉(zhuǎn)換為一個(gè)配置信息實(shí)體對(duì)象,提供給框架的其他部分使用。
- ExManagement.Interface:提供異常處理類(lèi)、異常日志記錄類(lèi)以及異常錯(cuò)誤報(bào)告類(lèi)的接口和基類(lèi),便于用戶(hù)在框架的基礎(chǔ)上進(jìn)行自定義的擴(kuò)展
- ExManagement.MessageHandler:對(duì)ExManagement.Interface中的IMessage接口實(shí)現(xiàn),提供了WebUI和WinUI下的彈出錯(cuò)誤信息提示的支持。也可以直接編寫(xiě)一個(gè)滿(mǎn)足IMessage接口的包,以自己需要的方式彈出錯(cuò)誤提示信息。
- ExManagement:是控制和管理框架按照配置信息進(jìn)行處理的控制類(lèi)。首先根據(jù)異常處理配置加載需要的異常處理類(lèi)和日志記錄類(lèi),再按照配置信息內(nèi)容對(duì)異常進(jìn)行處理。并提供唯一的接口供項(xiàng)目調(diào)用。
- ExManagement.Handler:默認(rèn)的異常處理包,包含了一種對(duì)異常處理的具體實(shí)現(xiàn)。用戶(hù)也可以繼承ExManagement.Interface中的ExHandlerBase基類(lèi),實(shí)現(xiàn)自定義的異常處理類(lèi),并通過(guò)修改配置文件讓框架調(diào)用。
- ExManagement.LogHandler:默認(rèn)日志記錄包,包含一種將異常日志記錄到數(shù)據(jù)庫(kù)的具體實(shí)現(xiàn)。用戶(hù)也可以實(shí)現(xiàn)ExManagement.Interface中的ILogHandler接口,實(shí)現(xiàn)自定義的異常處理類(lèi),并通過(guò)修改配置文件讓框架調(diào)用。
圖三-1
ExManagement.Config包
該包主要由兩部分組成:實(shí)現(xiàn)System.Configuration.IConfigurationSectionHandler接口的ExSectionHandler類(lèi)和配置信息實(shí)體類(lèi)ExManagerConfig。如圖三-2。
ExManagerConfig類(lèi)中又定義了3個(gè)嵌入類(lèi):ExHandlerConfig、LogHandlerConfig、LogHandlerConfigCollection以及三個(gè)枚舉ExAlertType、ErrorCodeSource、ExReturnMode。ExManagerConfig,ExHandlerConfig、LogHandlerConfig分別對(duì)應(yīng)配置文件中的 、 、 節(jié)點(diǎn)。ExManagerConfig是一個(gè)集合類(lèi),從System.Collections.CollectionBase繼承,包含若干個(gè)ExHandlerConfig對(duì)象,并通過(guò)索引器訪(fǎng)問(wèn)包含的ExHandlerConfig對(duì)象,支持以int和string兩種方式索引。ExHandlerConfig中除了包含對(duì)應(yīng)節(jié)的屬性外,還包含一個(gè)LogHandlerConfigCollection對(duì)象,是LogHandler類(lèi)的集合類(lèi)。
圖三-2
ExSectionHandler類(lèi)從配置文件中按照固定的格式獲取到相應(yīng)的配置信息,并將信息填充到ExManagerConfig。
配置文件
<configuration> <configSections> <section name="ExManager" type="ExManagement.Config.ExSectionHandler, ExManagement.Config" /> configSections>
<ExManager ErrorCodeSource="XML/DB" ConnectionString="" DataTable=""> <ExHandler Name="" Type="" ReturnMode="" AlertType="WebUI/WinUI/None"/> <ExHandler Name="" Type="" ReturnMode="" AlertType=""> <LogHandler Type="" ConnectionString="" DataTable=""/> <LogHandler Type="" ConnectionString="" DataTable=""/> ExHandler> ExManager> configuration> |
首先需要在Web.Config或者App.Config中添加這行
<section name="ExManager" type="ExManagement.Config.ExSectionHandler, ExManagement.Config" /> |
這句是指定用ExManagement.Config.ExSectionHandler類(lèi)來(lái)處理ExManager配置節(jié)點(diǎn)
- 節(jié)點(diǎn) 包含ErrorCodeSource和ConnectionString兩個(gè)屬性。
- ErrorCodeSource屬性 該屬性是設(shè)置從何種數(shù)據(jù)源獲取錯(cuò)誤編號(hào)與錯(cuò)誤信息的對(duì)應(yīng)關(guān)系。其值只能是枚舉ErrorCodeSource的值:XML或者DB。
- ConnectionString屬性 該屬性是設(shè)置數(shù)據(jù)源的位置。若ErrorCodeSource屬性設(shè)置的是XML,則此處為XML文件的FullName;若ErrorCodeSource屬性設(shè)置的是DB,則此處為數(shù)據(jù)庫(kù)的連接字符串。
- DataTable屬性 設(shè)置記錄異常日志使用的表名。
- 節(jié)點(diǎn) 此節(jié)點(diǎn)為 節(jié)點(diǎn)的子節(jié)點(diǎn),至少得有一個(gè)以上的子節(jié)點(diǎn)。包含Name、Type、ReturnMode以及AlertType屬性。
- Name屬性 為該異常處理器確定一個(gè)名稱(chēng)。在項(xiàng)目中調(diào)用異常處理方法時(shí),需要指定這個(gè)名稱(chēng)。一般建議用層的名字或者項(xiàng)目的名字。
- Type屬性 指定異常處理器的類(lèi),格式為Type=”ClassName, AssemblyName”。該類(lèi)必須從ExHandlerBase繼承。
- ReturnMode屬性 異常處理器處理后返回給項(xiàng)目的值類(lèi)型。對(duì)應(yīng)枚舉ExReturnMode的值,只能取Exception/ExceptionString/ErrorCode/ErrorString,分別含義是:拋出異常/返回異常詳細(xì)描述/返回錯(cuò)誤編號(hào)/返回錯(cuò)誤信息。
- AlertType屬性 報(bào)告異常信息的處理方式。對(duì)應(yīng)枚舉ExAlertType的值,只能取None/WebUI/WinUI。
- < LogHandler>節(jié)點(diǎn) 此節(jié)點(diǎn)為節(jié)點(diǎn)的子節(jié)點(diǎn),節(jié)點(diǎn)可以有0到若干個(gè)< LogHandler>子節(jié)點(diǎn)。
- Type屬性 用于指定日志記錄處理器的類(lèi)。格式為Type=”ClassName, AssemblyName”。該類(lèi)必須實(shí)現(xiàn)IExLogHandler接口。
- ConnectionString屬性 該屬性是設(shè)置記錄異常日志的數(shù)據(jù)源位置。
- DataTable屬性 設(shè)置記錄異常日志使用的表名。
ExManagement.Interface包
包含了IExLogHandler和I Message兩個(gè)接口以及ExHandlerBase基類(lèi),可以通過(guò)實(shí)現(xiàn)這些接口來(lái)對(duì)框架進(jìn)行擴(kuò)展。如圖三-3:
圖三-3
以下是ExHandlerBase基類(lèi)中加載所有異常日志對(duì)象的方法:
public void LoadLogHandler(ExManagerConfig.ExHandlerConfig config) { m_ExHandlerConfig = config; foreach (ExManagerConfig.LogHandlerConfig logConfig in config.LogConfigColletion) { object exLogHandler = System.Activator.CreateInstance(Type.GetType(logConfig.Type)); lstLogHandler.Add(exLogHandler); } } |
通過(guò)遍歷配置文件中該節(jié)包含的所有子節(jié)點(diǎn),并將配置中指定的LogHandler類(lèi)反射實(shí)例化,將對(duì)象存入隊(duì)列中。
ExManagement.MessageHandler包
該包包含兩個(gè)IMessage接口的實(shí)現(xiàn),分別完成對(duì)異常信息在WinUI和WebUI中的彈出提示功能。WinFormMessage和WebMessage分別引用了System.Web.Dll和System. Windows.Forms.Dll。如圖三-4。
圖三-4
ExManagement包
包含了ExManager類(lèi)和ErrorInfo類(lèi),是框架中核心的業(yè)務(wù)流程控制模塊。如圖三-5
圖三-5
ErrorInfo類(lèi):根據(jù)ErrorId查詢(xún)對(duì)應(yīng)的ErrorString。在這個(gè)類(lèi)里,會(huì)根據(jù)在配置文件中節(jié)的值去指定的數(shù)據(jù)源(XML文件或者數(shù)據(jù)庫(kù))查詢(xún)。
ExManager類(lèi),該類(lèi)是一個(gè)單例類(lèi),會(huì)在第一次實(shí)例化時(shí)獲取配置信息實(shí)體對(duì)象,并按照配置文件把所有指定的異常處理類(lèi)實(shí)例化后并存入一個(gè)哈希表中。以后實(shí)例化該類(lèi)都會(huì)重復(fù)使用之前實(shí)例化的該對(duì)象,避免反射造成的性能影響。通過(guò)調(diào)用該類(lèi)的ProcessException()方法將捕捉到的異常對(duì)象,錯(cuò)誤編號(hào),用來(lái)處理異常的異常處理器名(建議為該層的名稱(chēng))傳遞給框架,并按照參數(shù)從哈希表中取出對(duì)應(yīng)的異常處理對(duì)象,調(diào)用接口對(duì)異常進(jìn)行處理。
ExManagement.Handler包
只包含一個(gè)默認(rèn)的異常處理器類(lèi):DefaultExHandler,它從ExHandlerBase基類(lèi)繼承。下面是該類(lèi)里最重要的ProcessExeception方法。
public override string ProcessExeception(Exception ex, string strUserId, string strErrorCode) { // 記錄異常信息 LogEx(ex, strUserId, strErrorCode);
switch(m_ExHandlerConfig.ReturnMode) { // 返回類(lèi)型為錯(cuò)誤編碼 case ExManagement.ExReturnMode.ErrorCode: { return strErrorCode; } // 返回類(lèi)型為詳細(xì)錯(cuò)誤信息(友好提示) case ExManagement.ExReturnMode.ErrorString: { return ExManagement.ExManager.GetErrorInfoByCode(strErrorCode); } // 返回類(lèi)型為詳細(xì)異常信息(Exception.Message) case ExManagement.ExReturnMode.ExceptionString: { return ex.Message; } // 將異常向上拋出 case ExManagement.ExReturnMode.Exception: { // 如果是該層自身引發(fā)的異常則包裝后拋出 if(ex.GetBaseException() == ex) { throw new Exception(string.Format("{0}層發(fā)生異常:{1},{2}", m_ExHandlerConfig.Name, strErrorCode, ex.Message), ex); } // 若是捕捉到的是包裝后的異常(即上層拋出的) else { throw ex; } } default: { return null; } } } |
在這個(gè)默認(rèn)的異常處理類(lèi)的ProcessExeception方法中首先調(diào)用該類(lèi)中處理日志記錄的方法,再根據(jù)配置中的ExReturnMode決定返回處理的結(jié)果方式,對(duì)異常進(jìn)行處理。特別是當(dāng)設(shè)置為返回方式為Exception,即拋出異常對(duì)象時(shí)是先判斷該異常是否是最初發(fā)生的異常,還是已經(jīng)處理包裝過(guò)的異常,避免重復(fù)處理異常(不管異常是來(lái)自本層或者其他層)。
ExManagement.LogHandler包
該包只有一個(gè)默認(rèn)的DefaultLogHandler類(lèi),實(shí)現(xiàn)了ILogHandler接口,它負(fù)責(zé)把異常信息記錄到數(shù)據(jù)庫(kù)中。
我的項(xiàng)目中使用的各層配置文件(示例)
BusinessLogicLayer
<ExManager ErrorCodeSource="DB" ConnectionString="Data Source=PDMDEV151.ITDEV.ZTE.COM.CN;user id=PDM;password=" DataTable="ErrorInfo"> <ExHandler Name="BusinessLogicLayer" Type="ExManagement.Handler.DefaultExHandler, ExManagement.Handler" ReturnMode="Exception" AlertType="None"/> <LogHandler Type="ExManagement.LogHandler.DefaultLogHandler, ExManagement.LogHandler" ConnectionString="Data Source=PDMDEV151.ITDEV.ZTE.COM.CN;user id=PDM;password=" DataTable ="ExceptionLog"/> ExHandler> ExManager> |
配置意義為:根據(jù)ErrorId到數(shù)據(jù)庫(kù)ErrorInfo庫(kù)中獲取ErrorString,定義了一個(gè)ExHandler,名為BusinessLogicLayer的框架默認(rèn)的異常處理類(lèi),異常返回方式為拋出異常對(duì)象,因?yàn)椴皇?span lang="EN-US">UI層,所以AlerType為None,該異常處理類(lèi)用一個(gè)默認(rèn)的LogHandler把異常日志記錄到數(shù)據(jù)庫(kù)ExceptionLog。
BusinessFacadeLayer
<ExManager ErrorCodeSource="DB" ConnectionString="Data Source=PDMDEV151.ITDEV.ZTE.COM.CN;user id=PDM;password=" DataBase="ErrorInfo"> <ExHandler Name="BusinessFacadeLayer" Type="ExManagement.Handler.DefaultExHandler, ExManagement.Handler" ReturnMode="Exception" AlertType="None"/> <LogHandler Type="ExManagement.LogHandler.DefaultLogHandler, ExManagement.LogHandler" ConnectionString="Data Source=PDMDEV151.ITDEV.ZTE.COM.CN;user id=PDM;password=" DataTable ="ExceptionLog"/> ExHandler> ExManager> |
該層配置除ExHandler的Name不同外,與BusinessFacadeLayer的配置基本一致。
WebUILayer
<ExManager ErrorCodeSource="DB" ConnectionString="Data Source=PDMDEV151.ITDEV.ZTE.COM.CN;user id=PDM;password=" DataBase="ErrorInfo"> <ExHandler Name="WebUILayer" Type="ExManagement.Handler.DefaultExHandler, ExManagement.Handler" ReturnMode="ExceptionString" AlertType="WebUI"/> <LogHandler Type="ExManagement.LogHandler.DefaultLogHandler, ExManagement.LogHandler" ConnectionString="Data Source=PDMDEV151.ITDEV.ZTE.COM.CN;user id=PDM;password=" DataTable ="ExceptionLog"/> ExHandler> ExManager> |
該層的異常處理器的ReturnMode方式為ExceptionString(即Exception.Message),彈出提示方式為WebUI。
WinUILayer
<ExManager ErrorCodeSource="DB" ConnectionString="Data Source=PDMDEV151.ITDEV.ZTE.COM.CN;user id=PDM;password=" DataBase="ErrorInfo"> <ExHandler Name="WinUILayer" Type="ExManagement.Handler.DefaultExHandler, ExManagement.Handler" ReturnMode="ExceptionString" AlertType="WinUI"/> <LogHandler Type="ExManagement.LogHandler.DefaultLogHandler, ExManagement.LogHandler" ConnectionString="Data Source=PDMDEV151.ITDEV.ZTE.COM.CN;user id=PDM;password=" DataTable ="ExceptionLog"/> ExHandler> ExManager> |
該層和WebUILayer的配置除AlertType為WinUI方式外,基本一致。
以上配置為開(kāi)發(fā)調(diào)試方式時(shí),若是在發(fā)布到測(cè)試或正式環(huán)境,只需要把WinUILayer和WebUILayer中的ReturnMode屬性更改為ErrorString方式,即可讓用戶(hù)看到的是友好的錯(cuò)誤信息。
補(bǔ)充:WinUI項(xiàng)目的異常日志記錄器可以再增添一個(gè)本地異常Log文件方式,當(dāng)發(fā)生異常時(shí),可以根據(jù)用戶(hù)提供的Log文件進(jìn)行分析。
項(xiàng)目中調(diào)用
在寫(xiě)好配置文件之后,項(xiàng)目中引用ExManagement包。調(diào)用方法如下,項(xiàng)目中任何地方調(diào)用處理方式完全一致
// 返回值根據(jù)用戶(hù)配置而不同,可以為ErrorId, ErrorString以及ExceptionString string strMessage; try { ; } catch(Exception ex) { // 參數(shù)ex, 異常對(duì)象 // 參數(shù)"BLL001", ErrorId, 即錯(cuò)誤編號(hào) // 參數(shù)"BusinessLogicLayer", ExHandlerName, 即異常處理器名稱(chēng), 建議于層名稱(chēng)對(duì)應(yīng) // 參數(shù)UserId, 即當(dāng)前用戶(hù)Id ProcessExeception(ex, "BLL0001", "BusinessLogicLayer", UserId); } |
四、效果評(píng)價(jià)
可配置性。通過(guò)該異常處理框架可以方便的對(duì)異常處理進(jìn)行需要的配置。可配置的內(nèi)容:
可以配置多個(gè)異常日志記錄以不同的方式記錄在不同的位置;
異常處理方式可以有多種:拋出包裝后異常對(duì)象、 返回詳細(xì)的異常信息(調(diào)試用)、返回錯(cuò)誤提示信息(發(fā)布后給用戶(hù)看)以及錯(cuò)誤編號(hào);
靈活性。建立在可配置性的基礎(chǔ)上,可以組合出多種異常處理方案,以滿(mǎn)足不同項(xiàng)目的特殊需要。
開(kāi)放的可擴(kuò)展性。用戶(hù)可以自行實(shí)現(xiàn)框架提供的接口,自行擴(kuò)展異常處理以及異常日志記錄的類(lèi),以插件形式供框架調(diào)用,以實(shí)現(xiàn)最大可能的靈活性。
性能。因?yàn)槭褂昧瞬簧俜瓷浼夹g(shù),在性能上有一定損耗,但使用了單例模式來(lái)彌補(bǔ),只在項(xiàng)目第一出現(xiàn)異常的時(shí)候反射加載對(duì)象,以后再次調(diào)用時(shí)則直接使用該對(duì)象,對(duì)效率基本沒(méi)有任何損耗了。
而多數(shù)情況下,以框架提供的默認(rèn)解決方案已經(jīng)能夠滿(mǎn)足普通項(xiàng)目的需要,提供一個(gè)功能比較完整的,健壯的異常處理機(jī)制:
1) 方便和簡(jiǎn)化了開(kāi)發(fā)人員及時(shí)定位和發(fā)現(xiàn)異常原因;
2) 對(duì)系統(tǒng)運(yùn)行狀況提供了強(qiáng)有力的數(shù)據(jù)支持,并使錯(cuò)誤信息統(tǒng)一的方式管理,可以改善用戶(hù)體驗(yàn);
3) 當(dāng)項(xiàng)目在用戶(hù)使用中發(fā)現(xiàn)運(yùn)行錯(cuò)誤時(shí),可以記下系統(tǒng)反饋的異常記錄編號(hào)后于項(xiàng)目開(kāi)發(fā)人員聯(lián)系,而開(kāi)發(fā)人員可以根據(jù)記錄編號(hào)得到異常發(fā)生的詳細(xì)信息進(jìn)行分析。有助于縮短項(xiàng)目異常反饋時(shí)間。
五、推廣建議
該異常處理框架基本適合所有.NET項(xiàng)目,因?yàn)榭梢造`活的配置以適應(yīng)不同項(xiàng)目的具體需要。
在一個(gè)項(xiàng)目推廣中,只需要有一個(gè)人比較深入的了解該異常處理框架的原理以及如何進(jìn)行配置和自定義擴(kuò)展開(kāi)發(fā),掌握時(shí)間大概只需要半天到一天時(shí)間。而項(xiàng)目中其他人員無(wú)須知道該框架的運(yùn)行機(jī)制,他們只需要在每個(gè)捕捉異常的地方用同樣的、唯一的方法調(diào)用框架即可。
因?yàn)樵摽蚣軐?duì)于項(xiàng)目而言是高度聚合,低耦合的,對(duì)于項(xiàng)目而言不需要知道異常究竟會(huì)被如何處理,減少對(duì)項(xiàng)目的依賴(lài)。因此對(duì)于現(xiàn)有異常處理系統(tǒng)存在不足以及新項(xiàng)目是應(yīng)該大力推薦使用該框架進(jìn)行異常處理的,并且對(duì)現(xiàn)有項(xiàng)目的改造工作不大;當(dāng)然也可以選擇對(duì)項(xiàng)目已有部分不改動(dòng),新開(kāi)發(fā)部分進(jìn)行使用該框架進(jìn)行異常處理也是完全可以的。
異常處理框架本身沒(méi)有做任何自身的異常情況處理,所以在采用框架的時(shí)候需要先按照預(yù)想的配置在模擬環(huán)境中進(jìn)行調(diào)試,確認(rèn)能夠正常運(yùn)行之后再加入到正式項(xiàng)目中去,避免在正式環(huán)境中出現(xiàn)框架本身異常無(wú)法判斷的情況。
當(dāng)然因?yàn)楫惓L幚淼目赡芊桨副容^多,該框架的第一個(gè)版本可能會(huì)有遺漏的可能,但因?yàn)榭蚣鼙旧淼牧己脭U(kuò)展性,多數(shù)的特殊情況應(yīng)該可以用戶(hù)自行擴(kuò)展解決。若有無(wú)法解決的可以和我聯(lián)系,對(duì)框架本身代碼做調(diào)整,以求完善該框架。
另外,該異常處理框架若與最近討論比較熱門(mén)的AOP(ASPect Oriented Programming面向方面編程)思想結(jié)合可以最大程度使系統(tǒng)的業(yè)務(wù)代碼和系統(tǒng)異常處理代碼完全分離,并提供更為準(zhǔn)確的異常信息。因AOP技術(shù)目前在發(fā)展階段,并需要完全的純OOP項(xiàng)目中實(shí)施,暫不對(duì)此展開(kāi)討論。
it知識(shí)庫(kù):通用異常處理框架,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。