[外鏈圖片轉(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,不備注拒絕添加喲)