SpringMVC_異常處理的三種方式


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

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

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

3:使用異常處理注解

二:異常處理方式一

SimpleMappingExceptionResolver

當程序運行過程中出現異常,我們可以讓SpringMvc跳轉到指定的jsp中

1:自定義一個異常

package com.doaoao.myexception;
public class MyException extends Exception {

    public MyException(){
        super();
    }

    public MyException(String message){
        super(message);
    }
}

2:定義一個Controller,在該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;
    }
}

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

<!--異常處理-->
    <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中的值

在瀏覽器中訪問:

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

但我們在捕獲異常之前做出處理操作,例如將異常寫入日志文件中,若有多個異常要進行捕獲,者段代碼就會有冗余現象出現

可以通過定義異常處理器來解決該問題,如果發生異常,會自動執行接口中的方法 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM