SpringMVC_異常處理的三種方式

一:SpringMvc中常見異常處理三種方式

1:使用 SpringMvc 中的異常處理器SimpleMappingExceptionResolverjava

2:使用自定義異常處理器web

3:使用異常處理註解spring

二:異常處理方式一

SimpleMappingExceptionResolver數組

當程序運行過程當中出現異常,咱們能夠讓SpringMvc跳轉到指定的jsp中瀏覽器

1:自定義一個異常mvc

package com.doaoao.myexception; public class MyException extends Exception { public MyException(){ super(); } public MyException(String message){ super(message); } }

2:定義一個Controller,在該Controller中拋出自定義異常和系統異常app

package com.doaoao.controller; import com.doaoao.myexception.MyException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ExceptionController { @RequestMapping("/myException.do") public ModelAndView myException(String name)throws Exception{ ModelAndView mv = new ModelAndView(); if("doaoao".equals(name)){ throw new MyException("拋出自定義異常"); } if(!"doaoao".equals(name)){ throw new Exception("系統異常"); } return mv; } }

3:修改配置文件中的內容 springmvc.xml jsp

<!--異常處理-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="com.doaoao.myexception.MyException">error/MyError</prop>
            </props>
        </property>

        <property name="defaultErrorView" value="error/error"/>
        <property name="exceptionAttribute" value="ex"/>
    </bean>

<!-- 配置中內容說明 -->
<property name="exceptionMappings"> <props> <prop key="com.doaoao.myexception.MyException">error/MyError</prop> </props> </property> 1:key="com.doaoao.myexception.MyException":指定異常的全名,值爲當發生異常時響應的路徑名稱 2:error/MyError:當發生異常時響應的jsp路徑,若是配置視圖解析器,會使用視圖解析器中的目錄和後綴 3:<property name="defaultErrorView" value="error/error"/>:指定默認異常響應頁面,當發生的異常不是   exceptionMappings中定義的異常時,則使用默認異常響應頁面 4:<property name="exceptionAttribute" value="ex"/>捕獲到的異常對象,該對象通常用於響應的頁面中使用,
  可在響應頁面利用el表達式獲取value中的值

在瀏覽器中訪問:ide

http://localhost:8080/_01exception_war_exploded/myException.do?name=hahah
http://localhost:8080/_01exception_war_exploded/myException.do?name=doaoao
三:自定義異常處理器

但咱們在捕獲異常以前作出處理操做,例如將異常寫入日誌文件中,如有多個異常要進行捕獲,者段代碼就會有冗餘現象出現spa

能夠經過定義異常處理器來解決該問題,若是發生異常,會自動執行接口中的方法 resolveException()

1:定義Controller類(與上方代碼相同)

package com.doaoao.controller; import com.doaoao.myexception.MyException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ExceptionController { @RequestMapping("/myException.do") public ModelAndView myException(String name)throws Exception{ ModelAndView mv = new ModelAndView(); if("doaoao".equals(name)){ // 處理相關操做
            throw new MyException("拋出自定義異常"); } if(!"doaoao".equals(name)){ // 處理相關操做
            throw new Exception("系統異常"); } return mv; } }

2:定義異常處理器 

package com.doaoao.myexception; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, 
      HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mv
= new ModelAndView(); mv.addObject("ex", e); // 默認處理頁面 mv.setViewName("error/error"); // 判斷e是不是MyException if (e instanceof MyException) { // 處理捕獲異常後的操做 // 設置跳轉頁面 mv.setViewName("error/MyError"); } return mv; } }

3:修改配置文件 springmvc.xml

<bean class="com.doaoao.myexception.MyExceptionResolver"/>
 四:使用註解處理異常

使用註解 @ExceptionHandler 能夠將一個方法指定爲異常處理方法,該註解具備一個參數爲value,value的值爲一個Class數組,Class數組用於指定處理異常的類,當Controller中拋出的異常在這個Class數組中的時候纔會調用該異常處理方法

而被註解的異常處理方法,其返回值能夠是 ModelAndView、String,或 void,方法名隨意,方法參數能夠是 Exception 及其子類對象、HttpServletRequest、HttpServletResponse 等。系統會自動爲這些方法參數賦值

package com.doaoao.controller; import com.doaoao.myexception.MyException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ExceptionController { @RequestMapping("/myException.do") public ModelAndView myException(String name)throws Exception{ ModelAndView mv = new ModelAndView(); if("doaoao".equals(name)){ // 當拋出 MyException 時會被下方定義的 handlerException 處理
            throw new MyException("拋出自定義異常"); } if(!"doaoao".equals(name)){
            throw new Exception("系統異常"); } return mv; } @ExceptionHandler(MyException.class) public ModelAndView handlerException(Exception ex){ ModelAndView mv = new ModelAndView(); mv.addObject("ex", ex); mv.setViewName("/error/MyError"); return mv; } }

 

# 當Controller中拋出異常爲  MyException 時會被方法 handlerException 處理,但若是其它的Controller中拋出異常 MyException 時不會被該方法受理的,解決該問題的方法就是定義一個單獨處理異常方法的Controller,而後讓其它的Controller繼承該 Controller,但繼承是單繼承的,繼承了該Controller就不能在繼承其它的

  1:定義一個基類

package com.doaoao.controller; import com.doaoao.myexception.MyException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** * 異常處理基類 */ @Controller public class ExceptionController { // 處理MyException異常的方法 @ExceptionHandler(MyException.class) public ModelAndView handleMyException(Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("ex", ex); mv.setViewName("/error/MyError"); return mv; } // 其餘異常處理,註解中不用寫value屬性(默認) @ExceptionHandler public ModelAndView handleException(Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("ex", ex); mv.setViewName("/error/error"); return mv; } }

 2:定義Controller 繼承 ExceptionController  

@Controller @RequestMapping("/user") public class newController extends ExceptionController { @RequestMapping("/addUser.do") public ModelAndView addUser(Exception ex,String name) throws Exception{ ModelAndView mv = new ModelAndView(); if ("doaoao".equals(name)) { throw new MyException("拋出自定義異常"); } return mv; } }

...

本筆記參考自:小猴子老師教程 http://www.monkey1024.com

相關文章
相關標籤/搜索