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

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-YH5DMcXR-1601021324070)(https://imgkr.cn-bj.ufileos.com/50416f44-5b7e-43bb-a0c4-ee71be577c04.jpg)]

在 JavaEE 項(xiàng)目的開(kāi)發(fā)中,不管是對(duì)底層的數(shù)據(jù)庫(kù)操作過(guò)程鱼的,還是業(yè)務(wù)層的處理過(guò)程蒙挑,還是控制層的處理過(guò)程,都不可避免會(huì)遇到各種可預(yù)知的臂容、不可預(yù)知的異常需要處理科雳。每個(gè)過(guò)程都單獨(dú)處理異常,系統(tǒng)的代碼耦合度高脓杉,工作量大且不好統(tǒng)一糟秘,維護(hù)的工作量也很大。

SpringMvc 對(duì)于異常處理這塊提供了支持球散,通過(guò) SpringMvc 提供的全局異常處理機(jī)制尿赚,能夠?qū)⑺蓄?lèi)型的異常處理從各個(gè)處理過(guò)程解耦出來(lái),這樣既保證了相關(guān)處理過(guò)程的功能較單一蕉堰,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù)凌净。

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

- 使用 Spring MVC 提供的簡(jiǎn)單異常處理器 SimpleMappingExceptionResolver;

- 實(shí)現(xiàn) Spring 的異常處理接口 HandlerExceptionResolver 自定義自己的異常處理器屋讶;

- 使用 @ExceptionHandler 注解實(shí)現(xiàn)異常處理冰寻;

## 案例實(shí)操

### **全局異常處理方式一**

配置 SimpleMappingExceptionResolver 對(duì)象

~~~ xml

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

? ? <property name="defaultErrorView" value="error"></property>

? ? <property name="exceptionAttribute" value="ex"></property>

? ? <property name="exceptionMappings">

? ? ? ? <props>

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

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

? ? ? ? </props>

? ? </property>

</bean>

~~~

使用 SimpleMappingExceptionResolver 進(jìn)行異常處理,具有集成簡(jiǎn)單皿渗、有良好的擴(kuò)展性斩芭、對(duì)已有代碼沒(méi)有入侵性等優(yōu)點(diǎn),但該方法僅能獲取到異常信息羹奉,若在出現(xiàn)異常時(shí)秒旋,對(duì)需要獲取除異常以外的數(shù)據(jù)的情況不適用。

### **全局異常處理方式二**

實(shí)現(xiàn) HandlerExceptionResolver 接口?

~~~ java

@Component

public class GlobalException implements HandlerExceptionResolver {

? ? @Override

? ? public ModelAndView resolveException(HttpServletRequest request,

? ? ? ? HttpServletResponse response, Object handler, Exception ex) {

? ? ? ? ? ? Map<String,Object> map=new HashMap<String, Object>();

? ? ? ? ? ? map.put("ex", ex);

? ? ? ? ? ? ModelAndView mv=null;

? ? ? ? ? ? if(ex instanceof ParamsException){

? ? ? ? ? ? return new ModelAndView("error_param", map);

? ? ? ? ? ? }

? ? ? ? ? ? if(ex instanceof BusinessException){

? ? ? ? ? ? return new ModelAndView("error_business", map);

? ? ? ? ? ? }

? ? ? ? return new ModelAndView("error", map);

? ? }

}

~~~

使用實(shí)現(xiàn) HandlerExceptionResolver 接口的異常處理器進(jìn)行異常處理诀拭,具有集成簡(jiǎn)單迁筛、有良好的擴(kuò)展性、對(duì)已有代碼沒(méi)有入侵性等優(yōu)點(diǎn)耕挨,同時(shí)细卧,在異常處理時(shí)能獲取導(dǎo)致出現(xiàn)異常的對(duì)象,有利于提供更詳細(xì)的異常處理信息筒占。

### **全局異常處理方式三**

頁(yè)面處理器繼承 BaseController

~~~ java

public class BaseController {

? ? @ExceptionHandler

? ? public String exc(HttpServletRequest request,HttpServletResponse

? ? response,Exception ex){

? ? ? ? request.setAttribute("ex", ex);

? ? ? ? if(ex instanceof ParamsException){

? ? ? ? ? ? return "error_param";

? ? ? ? }

? ? ? ? if(ex instanceof BusinessException){

? ? ? ? ? ? return "error_business";

? ? ? ? }

? ? ? ? return "error";

? ? }

}

~~~

使用 @ExceptionHandler 注解實(shí)現(xiàn)異常處理贪庙,具有集成簡(jiǎn)單、有擴(kuò)展性好(只需要將要異常處理的 Controller 類(lèi)繼承于 BaseController 即可)翰苫、不需要附加 Spring 配置等優(yōu)點(diǎn)止邮,但該方法對(duì)已有代碼存在入侵性(需要修改已有代碼,使相關(guān)類(lèi)繼承于 BaseController)奏窑,在異常處理時(shí)不能獲取除異常以外的數(shù)據(jù)导披。

## 擴(kuò)展~未捕獲異常的處理

對(duì)于 Unchecked Exception 而言,由于代碼不強(qiáng)制捕獲埃唯,往往被忽略撩匕,如果運(yùn)行期產(chǎn)生了 Unchecked Exception,而代碼中又沒(méi)有進(jìn)行相應(yīng)的捕獲和處理墨叛,則我們可能不得不面對(duì)尷尬的 404止毕、500……等服務(wù)器內(nèi)部錯(cuò)誤提示頁(yè)面模蜡。我們需要一個(gè)全面而有效的異常處理機(jī)制。目前大多數(shù)服務(wù)器也都支持在 Web.xml 中通過(guò) <error-page>(Websphere/Weblogic) 或者 <error-code>(Tomcat) 節(jié)點(diǎn)配置特定異常情況的顯示頁(yè)面扁凛。修改 web.xml 文件忍疾,增加以下內(nèi)容:

~~~ xml

<!-- 出錯(cuò)頁(yè)面定義 -->

<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>

~~~

/error-page>

<error-page>

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

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

</error-page>

~~~

需要視頻配套文檔或更多資料+我們程序員小姐姐v:lezijie007(加好友時(shí)備注:b站-LT,不備注拒絕添加喲)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末令漂,一起剝皮案震驚了整個(gè)濱河市膝昆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叠必,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妹窖,死亡現(xiàn)場(chǎng)離奇詭異纬朝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)骄呼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)共苛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蜓萄,你說(shuō)我怎么就攤上這事隅茎。” “怎么了嫉沽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵辟犀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绸硕,道長(zhǎng)堂竟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任玻佩,我火速辦了婚禮出嘹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咬崔。我一直安慰自己税稼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布垮斯。 她就那樣靜靜地躺著郎仆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甚脉。 梳的紋絲不亂的頭發(fā)上丸升,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音牺氨,去河邊找鬼狡耻。 笑死墩剖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夷狰。 我是一名探鬼主播岭皂,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沼头!你這毒婦竟也來(lái)了爷绘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤进倍,失蹤者是張志新(化名)和其女友劉穎土至,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猾昆,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陶因,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垂蜗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楷扬。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贴见,靈堂內(nèi)的尸體忽然破棺而出烘苹,到底是詐尸還是另有隱情,我是刑警寧澤片部,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布镣衡,位于F島的核電站,受9級(jí)特大地震影響吞琐,放射性物質(zhì)發(fā)生泄漏捆探。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一站粟、第九天 我趴在偏房一處隱蔽的房頂上張望黍图。 院中可真熱鬧,春花似錦奴烙、人聲如沸助被。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揩环。三九已至,卻和暖如春幅虑,著一層夾襖步出監(jiān)牢的瞬間丰滑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工倒庵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褒墨,地道東北人炫刷。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像郁妈,于是被迫代替她去往敵國(guó)和親浑玛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348