SpringMVC全局異常處理的方式有哪些呢?

在 JavaEE 項目的開發(fā)中宏粤,不管是對底層的數(shù)據(jù)庫操作過程脚翘,還是業(yè)務(wù)層的處理過程,還是控制層的處理過程绍哎,都不可避免會遇到各種可預(yù)知的来农、不可預(yù)知的異常需要處理。每個過程都單獨處理異常崇堰,系統(tǒng)的代碼耦合度高沃于,工作量大且不好統(tǒng)一,維護的工作量也很大海诲。

SpringMvc 對于異常處理這塊提供了支持繁莹,通過 SpringMvc 提供的全局異常處理機制,能夠?qū)⑺蓄愋偷漠惓L幚韽母鱾€處理過程解耦出來特幔,這樣既保證了相關(guān)處理過程的功能較單一咨演,也實現(xiàn)了異常信息的統(tǒng)一處理和維護。

SpringMVC全局異常處理的三種方式

使用 Spring MVC 提供的簡單異常處理器 SimpleMappingExceptionResolver蚯斯;

實現(xiàn) Spring 的異常處理接口 HandlerExceptionResolver 自定義自己的異常處理器薄风;

使用 @ExceptionHandler 注解實現(xiàn)異常處理;

案例實操

全局異常處理方式一

配置 SimpleMappingExceptionResolver 對象

<beanclass="org.springframework.web.servlet.handler.SimpleMappingException Resolver">

<propertyname="defaultErrorView"value="error"></property>

<propertyname="exceptionAttribute"value="ex"></property>

<propertyname="exceptionMappings">

<props>

<propkey="com.xxx.exception.BusinessException">error1</prop>

<propkey="com.xxx.exception.ParamsException">error2</prop>

</props>

</property>

</bean>

使用 SimpleMappingExceptionResolver 進(jìn)行異常處理拍嵌,具有集成簡單遭赂、有良好的擴展性、對已有代碼沒有入侵性等優(yōu)點横辆,但該方法僅能獲取到異常信息撇他,若在出現(xiàn)異常時,對需要獲取除異常以外的數(shù)據(jù)的情況不適用龄糊。

全局異常處理方式二

實現(xiàn) HandlerExceptionResolver 接口?

@Component

publicclassGlobalExceptionimplementsHandlerExceptionResolver{

@Override

publicModelAndViewresolveException(HttpServletRequestrequest,

HttpServletResponseresponse,Objecthandler,Exceptionex) {

Map<String,Object>map=newHashMap<String,Object>();

map.put("ex",ex);

ModelAndViewmv=null;

if(exinstanceofParamsException){

? ? returnnewModelAndView("error_param",map);

? ? ? ? ?? }

if(exinstanceofBusinessException){

? ? returnnewModelAndView("error_business",map);

? ? ? ? ?? }

returnnewModelAndView("error",map);

?? }

}

使用實現(xiàn) HandlerExceptionResolver 接口的異常處理器進(jìn)行異常處理逆粹,具有集成簡單、有良好的擴展性炫惩、對已有代碼沒有入侵性等優(yōu)點僻弹,同時,在異常處理時能獲取導(dǎo)致出現(xiàn)異常的對象他嚷,有利于提供更詳細(xì)的異常處理信息蹋绽。

全局異常處理方式三

頁面處理器繼承 BaseController

publicclassBaseController{

@ExceptionHandler

publicStringexc(HttpServletRequestrequest,HttpServletResponse

response,Exceptionex){

request.setAttribute("ex",ex);

if(exinstanceofParamsException){

return"error_param";

? ? ?? }

if(exinstanceofBusinessException){

return"error_business";

? ? ?? }

return"error";

?? }

}

使用 @ExceptionHandler 注解實現(xiàn)異常處理芭毙,具有集成簡單、有擴展性好(只需要將要異常處理的 Controller 類繼承于 BaseController 即可)卸耘、不需要附加 Spring 配置等優(yōu)點退敦,但該方法對已有代碼存在入侵性(需要修改已有代碼,使相關(guān)類繼承于 BaseController)蚣抗,在異常處理時不能獲取除異常以外的數(shù)據(jù)侈百。

擴展~未捕獲異常的處理

對于 Unchecked Exception 而言,由于代碼不強制捕獲翰铡,往往被忽略钝域,如果運行期產(chǎn)生了 Unchecked Exception,而代碼中又沒有進(jìn)行相應(yīng)的捕獲和處理锭魔,則我們可能不得不面對尷尬的 404例证、500……等服務(wù)器內(nèi)部錯誤提示頁面。我們需要一個全面而有效的異常處理機制迷捧。目前大多數(shù)服務(wù)器也都支持在 Web.xml 中通過 <error-page>(Websphere/Weblogic) 或者 <error-code>(Tomcat) 節(jié)點配置特定異常情況的顯示頁面织咧。修改 web.xml 文件,增加以下內(nèi)容:

<!-- 出錯頁面定義 -->

<error-page>

? ? <exception-type>java.lang.Throwable</exception-type>

? ? <location>/500.jsp</location>

</error-page>

<error-page>

? ? <error-code>500</error-code>

? ? <location>/500.jsp</location>

</error-page>

<error-page>

? ? <error-code>404</error-code>

? ? <location>/404.jsp</location>

</error-page>

各位需要詳細(xì)資料的+小姐姐V:lezijie003(備注678漠秋,不備注不加哦笙蒙!)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膛堤,隨后出現(xiàn)的幾起案子手趣,更是在濱河造成了極大的恐慌,老刑警劉巖肥荔,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異朝群,居然都是意外死亡燕耿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門姜胖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉帅,“玉大人,你說我怎么就攤上這事右莱⊙料牵” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵慢蜓,是天一觀的道長亚再。 經(jīng)常有香客問我,道長晨抡,這世上最難降的妖魔是什么氛悬? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任则剃,我火速辦了婚禮,結(jié)果婚禮上如捅,老公的妹妹穿的比我還像新娘棍现。我一直安慰自己,他們只是感情好镜遣,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布己肮。 她就那樣靜靜地躺著,像睡著了一般悲关。 火紅的嫁衣襯著肌膚如雪谎僻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天坚洽,我揣著相機與錄音戈稿,去河邊找鬼。 笑死讶舰,一個胖子當(dāng)著我的面吹牛鞍盗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跳昼,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼般甲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鹅颊?” 一聲冷哼從身側(cè)響起敷存,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堪伍,沒想到半個月后锚烦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡帝雇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年涮俄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尸闸。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡彻亲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吮廉,到底是詐尸還是另有隱情苞尝,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布宦芦,位于F島的核電站宙址,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏踪旷。R本人自食惡果不足惜曼氛,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一豁辉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舀患,春花似錦徽级、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至低匙,卻和暖如春旷痕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顽冶。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工欺抗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人强重。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓绞呈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親间景。 傳聞我的和親對象是個殘疾皇子佃声,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容