摘 要:異常處理是任何軟件中都必須面對(duì)的一類問題,但傳統(tǒng)的異常處理過程會(huì)和程序中的其它代碼產(chǎn)生了一種緊耦合關(guān)系,這種緊耦合關(guān)系使得代碼的重用和維護(hù)非常困難。本文將結(jié)合面向方面編程討論基于AOP的異常處理模型,該模型能夠比較好的實(shí)現(xiàn)異常處理代碼和業(yè)務(wù)邏輯代碼的解耦,大大提高整個(gè)程序的重用性和可維護(hù)性。
關(guān)鍵詞:異常處理;面向方面編程;AOP
中圖分類號(hào):TP311.52
對(duì)異常的處理是任何軟件都必須面對(duì)的一類問題,然而傳統(tǒng)的異常處理方式會(huì)使得負(fù)責(zé)異常處理的代碼彌散在整個(gè)程序中,形成一種和其它代碼的緊耦合,這種緊耦合使得程序的可維護(hù)性和可重用性非常差,同時(shí)也會(huì)干擾正常的業(yè)務(wù)邏輯,不利于異常這類問題的集中處理。本文結(jié)合目前比較流行的面向方面編程,給出一種基于AOP的集中式異常處理模型,該模型可以很好的實(shí)現(xiàn)異常處理和其它代碼的分離解耦。這使程序員在編程之初可以更加專注于業(yè)務(wù)邏輯的處理而無須分心去處理異常,對(duì)異常的處理可以在隨后進(jìn)行集中化處理并通過AOP的織入功能加入到程序中來。這大大增強(qiáng)了整個(gè)程序的可維護(hù)性和可重用性,也使我們的程序代碼看起來會(huì)更加干凈、結(jié)構(gòu)清晰。
1 面向方面編程
面向方面編程(Aspect Oriented Programming)是對(duì)面向?qū)ο缶幊痰倪M(jìn)一步補(bǔ)充,它可以將散布在程序中的不相關(guān)對(duì)象中的一些相同邏輯抽取出來模塊化,從而進(jìn)一步提高了程序的重用性和可維護(hù)性。AOP能夠?qū)⒛切┡c業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯,例如:事務(wù)處理、日志管理、權(quán)限控制、異常處理、調(diào)試等模塊化,以降低模塊之間的耦合度,減少重復(fù)代碼的出現(xiàn)。
1.1 AOP基本概念[1]
方面(Aspect):對(duì)橫切性關(guān)注點(diǎn)的模塊化,是我們從業(yè)務(wù)模塊中抽取出來的一類相似邏輯的模塊化。
連接點(diǎn)(Joinpoint):是橫切性邏輯的觸發(fā)點(diǎn),可以是類的初始化、某方法的調(diào)用、特定異常的拋出。
通知(Advice):在特定的連接點(diǎn),AOP框架執(zhí)行的動(dòng)作。通知的類型[2]包含:“around”、“before”、“after throwing”、“after returning”等,用于定義執(zhí)行動(dòng)作在什么時(shí)機(jī)觸發(fā)。
切入點(diǎn)(Pointcut):一個(gè)通知被觸發(fā)的一系列連接點(diǎn)的集合。
目標(biāo)對(duì)象(Target Object):包含連接點(diǎn)的對(duì)象,是業(yè)務(wù)邏輯對(duì)象。
AOP代理對(duì)象(AOP Proxy):AOP框架創(chuàng)建目標(biāo)對(duì)象的代理象,通過代理對(duì)象對(duì)目標(biāo)對(duì)象的功能進(jìn)行增強(qiáng),將方面應(yīng)用到目標(biāo)對(duì)象。
織入(Weaving):AOP框架創(chuàng)建AOP代理對(duì)象的過程,它將我們橫切性關(guān)注點(diǎn)融入到當(dāng)前系統(tǒng)中,擴(kuò)展系統(tǒng)的功能。
AOP可以降低模塊的耦合度,使系統(tǒng)更易擴(kuò)展,增強(qiáng)代碼的復(fù)用性,還可以實(shí)現(xiàn)橫切性問題的遲綁定。
2 基于AOP的異常處理模型
圖1中給出的是一個(gè)使用AOP的異常處理模型。該異常處理模型中,Client為調(diào)用業(yè)務(wù)邏輯對(duì)象的客戶端,Target為提供服務(wù)的業(yè)務(wù)邏輯對(duì)象,ExAspect為處理異常的方面(Aspect),ExceptionHandler負(fù)責(zé)在截獲異常后對(duì)異常進(jìn)行處理,可以是對(duì)異常情況的記錄、發(fā)送通知等。在未使用AOP之前Client將會(huì)直接對(duì)Target進(jìn)行調(diào)用,異常處理代碼則被交織在業(yè)務(wù)邏輯代碼中,而在AOP異常處理模型中,Target被一個(gè)AOP代理對(duì)象所代理,AOP代理對(duì)象在調(diào)用Target之后捕捉異常,并對(duì)捕捉到的異常進(jìn)行處理,異常處理代碼則被模塊化入ExceptionHandler處理。這種方法實(shí)現(xiàn)了異常處理代碼和正常業(yè)務(wù)邏輯代碼的分離解耦,增強(qiáng)了代碼的復(fù)用性和可擴(kuò)展性。
下面我們以JAVA和Spring2.5為例,給出其程序代碼和配置的基本實(shí)現(xiàn)方式。
配置中定義了切面pointcut1為com.test.service包下的所有對(duì)象方法的執(zhí)行,定義了after-rhrowing類型的通知,當(dāng)切面中的連接點(diǎn)執(zhí)行并有異常拋出時(shí)會(huì)觸發(fā)ExAspect中doThrowing方法的執(zhí)行,在doThrowing方法中我們調(diào)用ExceptionHandler模塊對(duì)異常進(jìn)行處理。使用過程中AOP代理的創(chuàng)建則由框架完成,這個(gè)過程在AOP中叫織入(weaving)。
注意在Aspectj和Spring中after-throwing類型的通知在處理后會(huì)繼續(xù)把異常向上拋,如果想對(duì)異常類型進(jìn)行轉(zhuǎn)換或屏蔽,則可以使用around通知類型。
3 結(jié)束語
本文研究了AOP技術(shù)在異常處理上的應(yīng)用,并給出了一種實(shí)現(xiàn)模型。AOP技術(shù)的引入改變了傳統(tǒng)的異常處理方式,使得異常處理代碼和正常業(yè)務(wù)邏輯代碼實(shí)現(xiàn)了解耦,增強(qiáng)了代碼的復(fù)用性、可維護(hù)性、及程序可擴(kuò)展性,AOP技術(shù)的引入還使得我們可以做到異常處理代碼的延長(zhǎng)實(shí)現(xiàn),這樣在前期可以不用過多的考慮異常處理的問題,從而可以把主要精力集中在業(yè)務(wù)邏輯的實(shí)現(xiàn)上。
參考文獻(xiàn):
[1]Rod Johnson. Spring2.5參考手冊(cè).譯者:丁雪豐等,譯.Spring中文論壇,2008:105-149.
[2]The AspectJTM Programming Guide[EB/OL].http://www.eclipse.org/aspectj/doc/released/progguide/index.html,2003/2015.1
作者簡(jiǎn)介:趙文杰(1979-),男,河南安陽人,漢族,助理工程師,碩士研究生,研究方向:軟件工程。
作者單位:濮陽市安陽地區(qū)醫(yī)院 計(jì)算機(jī)中心,河南安陽 455000