鏃墮棿錛?006-06-01 浣滆咃細ShriKant Vashishtha 嫻忚嬈℃暟錛? 1184 鏈枃鍏抽敭瀛楋細J2EE,聽Struts,聽RuntimeException,聽design patterns,聽鏈浣沖疄璺?/a>,聽寮傚父澶勭悊,聽鍖呰,聽璁捐妯″紡,聽澶栬,聽妯℃澘鏂規硶 |
|
銆銆鍦ㄥぇ澶氭暟Java欏圭洰涓紝澶ч儴鍒嗕唬鐮侀兘鏄牱鏉夸唬鐮併傚紓甯稿鐞嗗氨灞炰簬姝ょ被浠g爜銆傚嵆浣夸笟鍔¢昏緫鍙湁3鍒?琛屼唬鐮侊紝鐢ㄤ簬寮傚父澶勭悊鐨勪唬鐮佷篃瑕佸崰10鍒? 20琛屻傛湰鏂囧皢璁ㄨ濡備綍璁╁紓甯稿鐞嗕繚鎸佺畝鍗曞拰鐩磋錛屼嬌寮鍙戜漢鍛樺彲浠ヤ笓蹇冧簬寮鍙戜笟鍔¢昏緫錛岃屼笉鏄妸鏃墮棿嫻垂鍦ㄧ紪鍐欏紓甯稿鐞嗙殑鏍鋒澘浠g爜涓娿傛湰鏂囪繕灝嗚鏄庣敤浜庡湪 J2EE鐜涓垱寤哄拰澶勭悊寮傚父鐨勫熀紜鐭ヨ瘑鍜屾寚瀵煎師鍒欙紝騫舵彁鍑轟簡涓浜涘彲浠ヤ嬌鐢ㄥ紓甯歌В鍐崇殑涓氬姟闂銆傛湰鏂囧皢浣跨敤Struts妗嗘灦浣滀負琛ㄧず瀹炵幇錛屼絾璇ユ柟娉曢傜敤浜庝換浣曡〃紺哄疄鐜般?/p>
銆銆鎮ㄦ槸鍚︽浘緇忔兂榪囷紝涓轟粈涔堣鍦ㄧ紪鍐欏ソ鐨勪唬鐮佸潡鍛ㄥ洿鏀劇疆涓涓猼ry-catch鍧楋紝鍗充究鏄庣煡閬撴棤娉曞榪欎簺寮傚父榪涜浠涔堝鐞嗭紝鑰屽彧婊¤凍浜庢妸瀹冧滑鏀懼湪 catch鍧椾腑錛熸偍鍙兘鎯崇煡閬擄紝涓轟粈涔堜笉鑳芥妸榪欓」宸ヤ綔鏀懼湪涓涓泦涓殑鍦版柟瀹屾垚錛熷湪澶у鏁版儏鍐典笅錛岃繖涓湴鏂瑰浜嶫2EE搴旂敤紼嬪簭鏉ヨ灝辨槸涓涓?a target="_blank">鍓嶇鎺у埗鍣?/a>銆? 鎹㈠彞璇濊錛屽紑鍙戜漢鍛樹笉浼氬洜涓哄畠浠屽彈鍒板共鎵幫紝鍥犱負鏍規湰涓嶅繀寰堝鍦拌繃闂畠浠備絾鏄紝濡傛灉涓涓柟娉曞悕縐板寘鍚竴涓猼hrows瀛愬彞錛屼細鍑虹幇浠涔堟儏鍐靛憿錛熷紑鍙戜漢鍛? 鎴栬呭繀欏繪崟鎹夎繖浜涘紓甯革紝鎴栬呮妸瀹冧滑鏀懼湪鑷繁鐨勬柟娉曠殑throws瀛愬彞涓傝繖灝辨槸鐥涜嫤鐨勬牴婧愶紒騫歌繍鐨勬槸錛孞ava API鏈変竴綾誨彨鍋歶nchecked exception鐨勫紓甯革紝瀹冧滑涓嶅繀鎹曟崏銆備絾鏄紝浠嶇劧瀛樺湪涓涓棶棰橈細鏍規嵁浠涔堟潵鍐沖畾鍝簺鏄痗hecked寮傚父錛屽摢浜涙槸unchecked寮傚父錛熶笅闈㈢粰鍑轟竴 浜涙寚瀵煎師鍒欙細
銆銆鍦ㄥぇ澶氭暟J2EE搴旂敤紼嬪簭涓紝鍏充簬閽堝鏌愪釜寮傚父搴旇鍦ㄥ摢涓鐣岄潰涓婃樉紺哄摢鏉¢敊璇秷鎭殑鍐崇瓥鍙兘鍦ㄨ〃紺哄眰涓仛鍑恒傝繖浼氬甫鏉ュ彟涓涓棶棰橈細涓轟粈涔堟垜浠笉鑳芥妸榪欑鍐崇瓥鏀懼湪涓涓叕鍏辯殑鍦版柟鍛紵鍦↗2EE搴旂敤紼嬪簭涓紝鍓嶇鎺у埗鍣?/a>灝辨槸涓涓繘琛屽父瑙佸鐞嗙殑闆嗕腑浣嶇疆銆?/p>
銆
銆姝ゅ錛屽繀欏繪湁涓縐嶇敤浜庝紶鎾紓甯哥殑閫氱敤鏈哄埗銆傚紓甯鎬篃闇瑕佷互涓縐嶆櫘閫傜殑鏂瑰紡寰楀埌澶勭悊銆備負姝わ紝鎴戜滑濮嬬粓闇瑕佸湪鎺у埗鍣ㄧ鎹曟崏鍩烘湰搴旂敤紼嬪簭寮傚父
BaseAppException銆傝繖鎰忓懗鐫鎴戜滑闇瑕佹妸BaseAppException寮傚父錛堝彧鏈夎繖涓紓甯革級鏀懼叆鍙互鎶涘嚭checked寮傚父鐨勬瘡涓柟娉?
鐨則hrows瀛愬彞涓傝繖閲岀殑姒傚康鏄嬌鐢ㄥ鎬佹潵闅愯棌寮傚父鐨勫疄闄呭疄鐜般傛垜浠湪鎺у埗鍣ㄤ腑鎹曟崏BaseAppException錛屼絾鏄墍鎶涘嚭鐨勭壒瀹氬紓甯稿疄渚嬪彲鑳?
鏄嚑涓淳鐢熷紓甯哥被涓殑浠繪剰涓涓傚熷姪浜庤繖縐嶆柟娉曪紝鍙互鑾峰緱璁稿寮傚父澶勭悊鏂歸潰鐨勭伒媧繪э細 銆銆涓嬮潰緇欏嚭鎶涘嚭checked寮傚父鐨勪竴涓緥瀛愶細 銆銆榪勪粖涓烘錛屾垜浠凡緇忚鏄庯紝瀵逛簬鎵鏈夊彲鑳芥姏鍑篶hecked寮傚父騫惰Controller璋冪敤鐨勬柟娉曪紝鍏秚hrows瀛愬彞涓簲璇ュ彧鍖呭惈
checked寮傚父銆傜劧鑰岋紝榪欏疄闄呬笂鏆楃ず鐫鎴戜滑鍦╰hrows瀛愬彞涓笉鑳藉寘鍚叾浠栦換浣曞簲鐢ㄧ▼搴忓紓甯搞備絾鏄紝濡傛灉闇瑕佸熀浜巆atch鍧椾腑鏌愮綾誨瀷鐨勫紓甯告潵鎵?
琛屼笟鍔¢昏緫錛岄偅鍙堣鎬庝箞鍔炲憿錛熻澶勭悊榪欑被鎯呭喌錛屾柟娉曡繕鍙互鎶涘嚭涓涓壒瀹氬紓甯搞傝浣忥紝榪欐槸涓縐嶇壒渚嬶紝寮鍙戜漢鍛樼粷瀵逛笉鑳借涓鴻繖鏄悊鎵褰撶劧鐨勩傚悓鏍鳳紝姝ゅ璁ㄨ鐨?
搴旂敤紼嬪簭寮傚父搴旇鎵╁睍BaseAppException綾匯備笅闈㈢粰鍑轟竴涓緥瀛愶細 銆銆鎵鏈塽nchecked寮傚父閮藉簲璇ュ湪web搴旂敤紼嬪簭灞傛涓婅繘琛屽鐞嗐傚彲浠ュ湪web.xml鏂囦歡涓厤緗畐eb欏甸潰錛屼互渚垮綋搴旂敤紼嬪簭涓嚭鐜皍nchecked寮傚父鏃訛紝鍙互鎶婅繖涓獁eb欏甸潰鏄劇ず緇欑粓绔敤鎴楓?/p>
銆銆褰撲竴涓紓甯歌搗婧愪簬鍙︿竴涓閮ㄦ帴鍙o紙緇勪歡錛夋椂錛屽簲璇ユ妸瀹冨寘瑁呭埌涓涓壒瀹氫簬搴旂敤紼嬪簭鐨勫紓甯鎬腑錛屽茍榪涜鐩稿簲澶勭悊銆?/p>
銆銆渚嬪瓙錛?/p>
銆銆榪欓噷錛孋opyPropertiesException鎵╁睍浜唈ava.lang.RuntimeException錛屾垜浠皢浼氳褰曞畠銆傛垜浠崟
鎹夌殑鏄疎xception錛岃屼笉鏄痗opyProperties鏂規硶鍙互鎶涘嚭鐨勭壒瀹歝hecked寮傚父錛屽洜涓哄浜庢墍鏈夎繖浜涘紓甯告潵璇達紝鎴戜滑閮戒細鎶涘嚭鍚屼竴涓?
unchecked CopyPropertiesException寮傚父銆?/p>
銆銆鎮ㄥ彲鑳芥兂鐭ラ亾錛屽鏋滄垜浠負姣忔潯閿欒娑堟伅鍒涘緩涓涓紓甯革紝寮傚父綾昏嚜韜槸鍚︿細婧㈠嚭鍛紵渚嬪錛屽鏋溾淥rder not
found鈥濇槸OrderNotFoundException鐨勪竴鏉¢敊璇秷鎭紝鎮ㄨ偗瀹氫笉浼氳CustomerNotFoundException鐨勯敊璇秷
鎭負鈥淐ustomer not
found鈥濓紝鐞嗙敱寰堟槑鏄撅細榪欎袱涓紓甯鎬唬琛ㄥ悓鏍風殑鎰忎箟錛屾儫涓鐨勫尯鍒湪浜庝嬌鐢ㄥ畠浠殑涓婁笅鏂囦笉鍚屻傛墍浠ワ紝濡傛灉鍙互鍦ㄥ鐞嗗紓甯告椂鎸囧畾涓婁笅鏂囷紝鎴戜滑鏃犵枒鍙互鎶婅繖浜?
寮傚父鍚堝茍涓轟竴涓猂ecordNotFoundException銆備笅闈㈢粰鍑轟竴涓緥瀛愶細 銆銆鍦ㄨ繖閲岋紝employee.addEmployee涓婁笅鏂囧皢琚檮鍔犵粰涓涓笂涓嬫枃鏁忔劅鐨勫紓甯哥殑閿欒浠g爜錛屼粠鑰屼駭鐢熸儫涓鐨勯敊璇唬鐮併備緥濡傦紝濡傛灉
RecordNotFoundException鐨勯敊璇唬鐮佹槸errorcode.recordnotfound錛岄偅涔堣繖涓笂涓嬫枃鐨勬渶緇堥敊璇唬鐮佸皢鍙樹負
errorcode.recordnotfound.employee.addEmployee錛屽畠瀵逛簬榪欎釜涓婁笅鏂囨槸鎯熶竴鐨勯敊璇唬鐮併?/p>
銆銆
鐒惰岋紝鎴戜滑瑕佺粰鍑轟竴涓鍛婏細濡傛灉鎮ㄥ噯澶囧湪鍚屼竴涓鎴風鏂規硶涓嬌鐢ㄥ涓帴鍙o紝鑰屼笖榪欎簺鎺ュ彛閮藉彲浠ユ姏鍑篟ecordNotFoundException寮傚父錛?
閭d箞鎯寵鐭ラ亾鏄摢涓疄浣撳紩鍙戜簡榪欎釜寮傚父灝卞彉寰楀崄鍒嗗洶闅俱傚鏋滀笟鍔℃帴鍙f槸鍏叡鐨勶紝鑰屼笖鍙互琚悇縐嶅閮ㄥ鎴風浣跨敤錛岄偅涔堝緩璁彧浣跨敤鐗瑰畾鐨勫紓甯革紝鑰屼笉浣跨敤鍍?
RecordNotFoundException榪欐牱鐨勪竴鑸у紓甯搞傜壒瀹氫簬涓婁笅鏂囩殑寮傚父瀵逛簬鍩轟簬鏁版嵁搴撶殑鍙仮澶嶅紓甯告潵璇撮潪甯告湁鐢紝鍥犱負鍦ㄨ繖縐嶆儏鍐典笅錛屽紓甯?
綾誨緇堟槸鐩稿悓鐨勶紝涓嶅悓鐨勫彧鏈夊畠浠嚭鐜扮殑涓婁笅鏂囥?/p>
銆銆姝e鍓嶉潰璁ㄨ鐨勯偅鏍鳳紝鎴戜滑闇瑕佸畾涔変竴涓紓甯稿熀綾伙紝鍙仛BaseAppException錛屽畠鍖呭惈浜嗘墍鏈夊簲鐢ㄧ▼搴忓紓甯哥殑榛樿琛屼負銆傛垜浠皢鎶婅繖涓熀
綾繪斁鍒版墍鏈夊彲鑳芥姏鍑篶hecked寮傚父鐨勬柟娉曠殑throws瀛愬彞涓傚簲鐢ㄧ▼搴忕殑鎵鏈塩hecked寮傚父閮藉簲璇ユ槸榪欎釜鍩虹被鐨勫瓙綾匯傛湁澶氱瀹氫箟閿欒澶勭悊鎶借薄鐨?
鏂瑰紡銆傜劧鑰岋紝鍏朵腑鐨勫尯鍒洿澶氬湴鏄笌涓氬姟綾昏屼笉鏄笌鎶鏈湁鍏熾傚閿欒澶勭悊鐨勬娊璞″彲鍒嗕負浠ヤ笅鍑犵被銆傛墍鏈夎繖浜涘紓甯哥被閮芥槸浠嶣aseAppException媧劇敓
鑰屾潵銆?/p>
銆銆琛ㄧず灞傜嫭鑷礋璐e喅瀹氬涓涓紓甯擱噰鍙栦粈涔堟搷浣溿傝繖縐嶅喅絳栨秹鍙婂埌璇嗗埆鎶涘嚭寮傚父鐨勯敊璇唬鐮併傛澶栵紝鎴戜滑榪橀渶瑕佺煡閬撳湪澶勭悊閿欒涔嬪悗搴旇鎶婇敊璇秷鎭噸瀹氬悜鍒板摢涓鐣岄潰銆?/p>
銆銆鎴戜滑闇瑕佸鍩轟簬寮傚父綾誨瀷鑾峰緱閿欒浠g爜榪欎釜榪囩▼榪涜鎶借薄銆傚繀瑕佹椂榪樺簲璇ユ墽琛屾棩蹇楄褰曘傛垜浠妸榪欑鎶借薄縐頒箣涓篍xceptionHandler銆傚畠鍩轟簬鈥滃洓浜哄府鈥?Gang of Four錛孏OF) 澶栬妯″紡錛堛?a target="_blank">Design Patterns
public void updateUser(UserDTO userDTO)
throws BaseAppException{
UserDAO userDAO = new UserDAO();
UserDAO.updateUser(userDTO);
...
if(...)
throw new RegionNotActiveException(
"Selected region is not active");
}
Controller Method:
...
try{
User user = new User();
user.updateUser(userDTO);
}catch(BaseAppException ex){
//ExceptionHandler is used to handle
//all exceptions derived from BaseAppException
}
...CustomerDAO method:
//throws CustomerNotActiveException along with
//BaseAppException
public CustomerDTO getCustomer(InputDTO inputDTO)
throws BaseAppException,
CustomerNotActiveException {
. . .
//Make a DB call to fetch the customer
//details based on inputDTO
. . .
// if not details found
throw new CustomerNotActiveException(
"Customer is not active");
}
Client method:
//catch CustomerNotActiveException
//and continues its processing
public CustomerDTO getCustomerDetails(
UserDTO userDTO)
throws BaseAppException{
...
CustomerDTO custDTO = null;
try{
//Get customer details
//from local database
customerDAO.getCustomerFromLocalDB();
}catch(CustomerNotActiveException){
...
return customerDAO
.activateCustomerDetails();
}
}鍦╳eb搴旂敤紼嬪簭灞傛涓婂鐞唘nchecked寮傚父
鎶婄涓夋柟寮傚父鍖呰鍒扮壒瀹氫簬搴旂敤紼嬪簭鐨勫紓甯鎬腑
try {
BeanUtils.copyProperties(areaDTO, areaForm);
} catch (Exception se) {
throw new CopyPropertiesException(
"Exception occurred while using
copy properties", se);
}榪囧寮傚父
try{
...
}catch(BaseAppException ex){
IExceptionHandler eh =ExceptionHandlerFactory
.getInstance().create();
ExceptionDTO exDto = eh.handleException(
"employee.addEmployee", userId, ex);
}J2EE搴旂敤紼嬪簭鐨勫紓甯稿眰嬈$粨鏋?/h3>
checked寮傚父
unchecked寮傚父
琛ㄧず灞備笂鐨勫紓甯稿鐞?/h3>
try{
...
DivisionDTO storeDTO = divisionBusinessDelegate
.getDivisionByNum(fromDivisionNum);
}catch(BaseAppException ex){
IExceptionHandler eh = ExceptionHandlerFactory
.getInstance().create();
String expContext = "divisionAction.searchDivision";
ExceptionDTO exDto = eh.handleException(
expContext , userId, ex);
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR
,new ActionError(
exDto.getMessageCode()));
saveErrors(request, errors);
return actionMapping.findForward(
"SearchAdjustmentPage");
}
銆銆濡傛灉鏇翠粩緇嗗湴瑙傚療鎴戜滑鍒氬垰緙栧啓鐨勫紓甯稿鐞嗕唬鐮侊紝鎮ㄥ彲鑳戒細鎰忚瘑鍒幫紝涓烘瘡涓猄truts鏂規硶緙栧啓鐨勪唬鐮佹槸鍗佸垎鐩鎬技鐨勶紝榪欎篃鏄竴涓棶棰樸傛垜浠殑鐩爣鏄敖鍙兘鍦板幓鎺夋牱鏉夸唬鐮併傛垜浠渶瑕佸啀嬈″瀹冭繘琛屾娊璞°?/p>
銆銆瑙e喅鏂規鏄嬌鐢?a target="_blank">妯℃澘鏂規硶錛圱emplate Method錛夎璁℃ā寮忥紙寮曡嚜GOF錛氣滃畠鐢ㄤ簬瀹炵幇涓涓畻娉曠殑涓嶅彉閮ㄥ垎錛屽茍鎶婂彲鍙樼殑綆楁硶閮ㄥ垎鐣欑粰瀛愮被鏉ュ疄鐜般傗濓級銆傛垜浠渶瑕佷竴涓寘鍚ā鏉挎柟娉曞艦寮忕畻娉曠殑鍩? 綾匯傝綆楁硶灝嗗寘鍚敤浜嶣aseAppException鐨則ry-catch鍧楀拰瀵筪ispatchMethod鏂規硶鐨勮皟鐢紝鏂規硶瀹炵幇錛堝鎵樼粰媧劇敓綾伙級濡? 涓嬮潰鐨勫熀浜嶴truts鐨凙ction涓墍紺猴細
public abstract class BaseAppDispatchAction
extends DispatchAction{
...
protected static ThreadLocal
expDisplayDetails = new ThreadLocal();
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception{
...
try{
String actionMethod = request
.getParameter(mapping.getParameter());
finalDestination =dispatchMethod(mapping,
form, request, response,actionMethod);
}catch (BaseAppException Ex) {
ExceptionDisplayDTO expDTO =
(ExceptionDisplayDTO)expDisplayDetails
.get();
IExceptionHandler expHandler =
ExceptionHandlerFactory
.getInstance().create();
ExceptionDTO exDto = expHandler
.handleException(
expDTO.getContext(), userId, Ex);
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError(exDto
.getMessageCode()));
saveErrors(request, errors);
return mapping.findForward(expDTO
.getActionForwardName());
} catch(Throwable ex){
//log the throwable
//throw ex;
} finally {
expDisplayDetails.set(null);
}
銆銆鍦⊿truts涓紝DispatchAction::dispatchMethod鏂規硶鐢ㄤ簬鎶婅姹傝漿鍙戠粰姝g‘鐨凙ction鏂規硶錛屽彨鍋歛ctionMethod銆?/p>
銆 銆鎴戜滑鍋囧畾浠庝竴涓狧TTP璇鋒眰鑾峰緱searchDivision浣滀負actionMethod錛歞ispatchMethod灝嗗湪 BaseAppDispatchAction鐨勬淳鐢烝ction綾諱腑鎶婅姹傚垎媧劇粰searchDivision鏂規硶銆傚湪榪欓噷錛屾偍鍙互鐪嬪埌錛屽紓甯稿鐞嗕粎鍦ㄥ熀 綾諱腑瀹屾垚錛岃屾淳鐢熺被鍒欏彧瀹炵幇Action鏂規硶銆傝繖閲囩敤浜嗘ā鏉挎柟娉曡璁℃ā寮忥紝鍦ㄨ妯″紡涓紝寮傚父澶勭悊閮ㄥ垎鏄繚鎸佷笉鍙樼殑錛岃宒ispatchMethod鏂規硶鐨? 瀹為檯瀹炵幇錛堝彲鍙橀儴鍒嗭級鍒欎氦鐢辨淳鐢熺被瀹屾垚銆?/p>
銆銆淇敼鍚庣殑Struts Action鏂規硶濡備笅鎵紺猴細
...
String exceptionActionForward =
"SearchAdjustmentPage";
String exceptionContext =
"divisionAction.searchDivision";
ExceptionDisplayDTO expDTO =
new ExceptionDisplayDTO(expActionForward,
exceptionContext);
expDisplayDetails.set(expDTO);
...
DivisionDTO divisionDTO =divisionBusinessDelegate
.getDivisionByNum(fromDivisionNum);
...
銆銆鐜板湪瀹冪湅璧鋒潵鐩稿綋娓呮櫚銆傚洜涓哄紓甯稿鐞嗘槸鍦ㄤ竴涓泦涓殑浣嶇疆涓?BaseAppDispatchAction)瀹屾垚鐨勶紝鎵嬪姩閿欒鍙兘閫犳垚鐨勫獎鍝嶄篃闄嶈嚦鏈浣庛?/p>
銆銆鐒惰岋紝鎴戜滑闇瑕佽緗紓甯鎬笂涓嬫枃鍜孉ctionForward鏂規硶鐨勫悕縐幫紝濡傛灉鏈夊紓甯稿嚭鐜幫紝璇鋒眰灝變細琚漿鍙戝埌璇ユ柟娉曘傛垜浠皢鍦═hreadLocal鍙橀噺expDisplayDetails涓緗繖浜涘唴瀹廣?/p>
銆 銆浣嗘槸錛屼負浠涔堣浣跨敤java.lang.ThreadLocal鍙橀噺鍛紵expDisplayDetails鏄? BaseAppDispatchActiion綾諱腑鐨勪竴涓彈淇濇姢鏁版嵁鎴愬憳錛岃繖涔熸槸瀹冮渶瑕佹槸綰跨▼瀹夊叏鐨勫師鍥犮俲ava.lang.ThreadLocal瀵? 璞″湪榪欓噷渚垮彲媧句笂鐢ㄥ満銆?/p>
銆銆鍦ㄤ笂涓閮ㄥ垎涓紝鎴戜滑璁ㄨ浜嗗浣曞寮傚父澶勭悊榪涜鎶借薄銆備笅闈㈢粰鍑轟竴浜涘簲璇ユ弧瓚崇殑綰︽潫錛?/p>
銆銆鎮ㄥ彲鑳藉凡緇忔敞鎰忓埌浜嗭紝鎴戜滑鍦ㄨ〃紺哄眰涓崟鎹夌殑鎯熶竴寮傚父灝辨槸BaseAppException銆傜敱浜庢墍鏈塩hecked寮傚父閮芥槸 BaseAppException鐨勫瓙綾伙紝榪欐剰鍛崇潃鎴戜滑瑕佹崟鎹塀aseAppException鐨勬墍鏈夋淳鐢熺被銆傚熀浜庣被鍚嶇О鏉ヨ瘑鍒敊璇唬鐮佸啀瀹規槗涓嶈繃浜嗐?/p>
//exp is an object of BaseAppException
String className = exp.getClass().getName();
銆銆鍙互鍩轟簬寮傚父綾葷殑鍚嶇О鍦ㄤ竴涓猉ML鏂囦歡錛坋xceptioninfo.xml錛変腑瀵歸敊璇唬鐮佽繘琛岄厤緗備笅闈㈢粰鍑哄紓甯擱厤緗殑涓涓緥瀛愶細
<exception name="EmployeeConfirmationException">
<messagecode>messagecode.laborconfirmation</messagecode>
<confirmationind>true</confirmationind>
<loggingtype>nologging</loggingtype>
</exception>
銆銆姝e鎮ㄧ湅鍒扮殑閭f牱錛屾垜浠妸榪欎釜寮傚父鍙樹負鏄懼紡錛岃浣跨敤鐨勬秷鎭唬鐮佹槸messagecode.employeeconfirmation銆傜劧鍚庯紝涓轟簡瀹炵幇鍥介檯鍖栫殑鐩殑錛屽彲浠ヤ粠ResourceBundle鎻愬彇瀹為檯鐨勬秷鎭傛垜浠緢娓呮錛屼笉闇瑕佸榪欑被寮傚父鎵ц鏃ュ織璁板綍錛屽洜涓哄畠鍙槸涓鏉$‘璁ゆ秷鎭紝鑰屼笉鏄竴涓簲鐢ㄧ▼搴忛敊璇?/p>
銆銆璁╂垜浠湅涓鐪嬩笂涓嬫枃鏁忔劅寮傚父鐨勪竴涓緥瀛愶細
<exception name="RecordNotFoundException">
<messagecode>messagecode.recordnotfound</messagecode>
<confirmationind>false</confirmationind>
<contextind>true</contextind>
<loggingtype>error</loggingtype>
</exception>
銆銆鍦ㄨ繖閲岋紝榪欎釜琛ㄨ揪寮忕殑contextind涓簍rue銆傚湪handleException鏂規硶涓紶閫掔殑涓婁笅鏂囧彲鐢ㄤ簬鍒涘緩鎯熶竴鐨勯敊璇唬鐮併備緥濡傦紝 濡傛灉鎴戜滑鎶妎rder.getOrder褰撲綔涓涓笂涓嬫枃榪涜浼犻掞紝緇撴灉寰楀埌鐨勬秷鎭唬鐮佸氨鏄紓甯哥殑娑堟伅浠g爜鍜屾墍浼犻掔殑涓婁笅鏂囩殑涓茶仈銆傚洜姝わ紝鎴戜滑鑾峰緱浜嗕竴涓儚 messagecode.recordnotfound.order.getOrder榪欐牱鐨勬儫涓娑堟伅浠g爜銆?/p>
銆銆瀵逛簬姣忎釜寮傚父鏉ヨ錛屽彲浠ユ妸 exceptioninfo.xml 涓殑鏁版嵁灝佽鍒頒竴涓彨鍋欵xceptionInfoDTO鐨勬暟鎹紶杈撳璞★紙data transfer object錛孌TO錛夈傜幇鍦紝鎴戜滑榪橀渶瑕佷竴涓崰浣嶇錛岀敤浜庣紦瀛樿繖浜涘璞★紝鍥犱負鎴戜滑涓嶆兂鍦ㄥ紓甯稿嚭鐜版椂鍙嶅瑙f瀽XML鏂囦歡鍜屽垱寤哄璞°傝繖欏瑰伐浣滃彲浠ュ鎵樼粰涓 涓彨鍋欵xceptionInfoCache鐨勭被鏉ュ畬鎴愶紝榪欎釜綾誨皢浼氬湪浠巈xceptioninfo.xml鏂囦歡璇誨彇ExceptionInfoDTO瀵? 璞′俊鎭箣鍚庣紦瀛樻墍鏈夎繖浜涘璞°?/p>
銆銆鐜板湪鎮ㄦ槸鍚﹀紕娓呮浜嗚繖鏁翠釜榪囩▼錛熻繖縐嶆柟娉曠殑鏍稿績閮ㄥ垎鏄疎xceptionHandler瀹炵幇錛岃瀹炵幇灝嗕嬌 鐢ㄥ皝瑁呭湪ExceptionInfoDTO涓殑鏁版嵁鏉ヨ幏鍙栨秷鎭唬鐮侊紝鍒涘緩ExceptionDTO瀵硅薄錛岀劧鍚庡熀浜庡湪緇欏畾寮傚父鐨? ExceptionInfoDTO涓寚瀹氱殑鏃ュ織璁板綍綾誨瀷鏉ヨ褰曞畠銆?/p>
銆銆涓嬮潰鏄疎xceptionHandler瀹炵幇鐨刪andleException鏂規硶錛?/p>
public ExceptionDTO handleException(String userId,
BaseAppException exp) {
ExceptionDTO exDTO = new ExceptionDTO();
ExceptionInfoCache ecache =
ExceptionInfoCache.getInstance();
ExceptionInfo exInfo = ecache
.getExceptionInfo(
ExceptionHelper.getClassName(exp));
String loggingType = null;
if (exInfo != null) {
loggingType = exInfo.getLoggingType();
exDTO.setConfirmation(exInfo
.isConfirmation());
exDTO.setMessageCode(exInfo
.getMessageCode());
}
FileLogger logger = new FileLoggerFactory()
.create();
logger.logException(exp, loggingType);
銆銆鏍規嵁涓嶅悓鐨勪笟鍔¢渶姹傦紝ExceptionHandler鎺ュ彛鍙互鏈夊縐嶅疄鐜般傚喅瀹氫嬌鐢ㄤ綍縐嶅疄鐜扮殑浠誨姟鍙氦鐢盕actory鏉ュ畬鎴愶紝鐗瑰埆鏄疎xceptionHandlerFactory綾匯?/p>
銆銆濡傛灉緙轟箯鍏ㄩ潰鐨勫紓甯稿鐞嗙瓥鐣ワ紝涓浜涚壒孌婄殑寮傚父澶勭悊鍧椾究鍙兘瀵艱嚧鍑虹幇闈炴爣鍑嗙殑閿欒澶勭悊鍜屼笉鍙淮鎶ょ殑浠g爜銆傞氳繃浣跨敤涓婇潰鐨勬柟娉曪紝渚垮彲綆鍖朖2EE搴旂敤紼嬪簭涓殑寮傚父澶勭悊榪囩▼銆?/p>
鍘熸枃鍑哄錛?/strong> http://www.onjava.com/pub/a/onjava/2006/01/11/exception-handling-framework-for-j2ee.html
聽浣滆呯畝浠?/span> | |
|
ShriKant Vashishtha 褰撳墠鏄嵃搴ata Consultancy Services Limited (TCS)鍏徃鐨勮В鍐蟲柟妗堟灦鏋勫笀銆?/td> |