程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Acegi(十一):借鑒Acegi的Exception的異常處理

Acegi(十一):借鑒Acegi的Exception的異常處理

編輯:關於JAVA

今天改項目中的一個問題時, 不由自住地想到了Acegi異常處理. 現在相比項目中的異常處理後, 很是感歎Acegi對異常的處理呀.

先大致回憶下Acegi裡的異常處理. 這裡說Acegi的異常處理是指圍繞ExceptionTranslationFilter展開的, 當然別的地方也有,暫時不做考慮.

Acegi配置中在filterInvocationInterceptor前加了一個 exceptionTranslationFilter, 這樣在整個方法調用棧裡, exceptionTranslationFilter的doFilter是比filterInvocationInterceptor要低一層的, 而filterInvocationInterceptor的doFilter是很有可能拋出多種異常的, 這些異常即包含Acegi自身的認證時異常和權限不夠異常,也包含Serlet規范中可能拋出ServletException或 IOException. 不過filterInvocationInterceptor自身並沒有處理任何異常,  不管有什麼異常都采取順其自然的方式,而且它自己還拋出了AuthenticationException和AccessDeniedException 兩個異常.

異常由誰處理呢? 交給exceptionTranslationFilter來處理, 顧名思義, 這個Filter的本職工作就是來處理異常這些麻煩事的. 看源碼, 我們知道, 這個filter除了異常處理外什麼事都不做. 由handleException這個方法來專門跟來自filterInvocationInterceptor的異常打交道.

這樣做有什麼好處? 好處大大的, 解耦合, "沖鋒陷陣"的"沖鋒陷陣",做"後勤"的做"後勤", 大家各司其職,有條不紊, 這樣兩方都能發揮出最大作用.最終的整體作戰效果也會出奇地好.

再看項目中的一個小例子, 看如下代碼:

Java代碼

protected String sendAlertMessage(String to,String subject,String msg,String from) {
SimpleMailMessage mailMessage = createMessage(to,subject, msg,from);
try{
mailEngine.sendEmail(mailMessage);
}
catch(MailException ex) {
log.error(ex.getMessage());
return ex.getMessage();
}
return "1";
}

這段代碼是用來發郵件的, 我們看下這裡的異常處理. mailEngine的sendEmail會拋出異常的, 看了下文檔它的拋出的異常為MailException, 而MailException有四個子類: MailAuthenticationException,MailParseException,MailPreparationException, MailSendException.而這裡都給catch住了, 只把異常的message以String類型返回, 這樣sendAlertMessage方法的調用者要想知道是郵件發送失敗的原因就得煩些周折了. 本來MailException及其子類有很豐富的異常信息, 但由於sendAlertMessage方法的越俎代庖,畫蛇添足了.

現在假設這樣一種情況, 程序要發郵件, 可收件人的地址不存在, 系統要求把報錯信息反饋給終端用戶, 即顯示信息"由AAA發送給BBB的郵件,由於BBB的email不存在而發送失敗", 這裡為了更友好地顯示, AAA用的是Ta的真名,而沒有用Ta的郵件地址. 為了顯示這樣的報錯信息, 調用sendAlertMessage就麻煩大了,因為這裡是沒有AAA的真名的.

於是我們想,能不能像Acegi裡處理異常那樣用一個單獨的方法來做呢?  這樣的設計顯然是行的通的.

-----------後記-------------

1, 初學Java時, 知道OOP時異常處理的優勢. 可項目中或自己寫代碼時,很少能全局地考慮異常處理, 大多情況下,發現IDE裡顯示有異常沒處理了,想也沒多想地給catch住了, 現在看來,異常處理時學問不小.

2, 這篇也是鑽研Acegi以來,除Security方面外,感覺對自己面向對象幫助最大也最明顯的一次, 也讓自己小小竊喜了下.

3, 其實是昨天發現項目中sendAlertMessage方法的不妙的, 當時也想寫下來, 可老是理不出思路來. 今天做完頭給安排的工作後,趁著情緒高漲,再回頭看這個問題時, 一下就想到Acegi時的異常處理. 於是有了這篇還算說得過去的記錄. 頭腦要清醒,否則要放一放了. 遇到問題,不要急也不要氣餒, 辦法總是有的, 靜下心一遍兩遍地去看,會有線索的. 呵呵, 有點想小學生作文.

4,  不要只想著成功,更要想著失敗後的信息的反饋.好像大多數情況下, 失敗考慮的很少.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved