SpringMVC處理異常的三種方式


  1. 使用 @ ExceptionHandler 注解

  2. 實現 HandlerExceptionResolver 接口

  3. 使用 @controlleradvice 注解

1. 使用 @ ExceptionHandler 注解

使用該注解有一個不好的地方就是:進行異常處理的方法必須與出錯的方法在同一個Controller里面,可以看到,這種方式最大的缺陷就是不能全局控制異常。每個類都要寫一遍。

@Controller

public class UserController {
    /**

     * 模擬 NullPointerException

     * @return

     */

    @RequestMapping("/show1")

    public String showInfo(){

        String str = null;

        str.length();

        return "index";

    }
    /**

     * 模擬 ArithmeticException

     * @return

     */

    @RequestMapping("/show2")

    public String showInfo2(){

        int a = 10/0;

        return "index";

    }

    /**

     * java.lang.ArithmeticException

     * 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常信息以及視圖的指定

     * 參數 Exception e:會將產生異常對象注入到方法中

     */

    @ExceptionHandler(value={java.lang.ArithmeticException.class})

    public ModelAndView arithmeticExceptionHandler(Exception e){

        ModelAndView mv = new ModelAndView();

        mv.addObject("error", e.toString());

        mv.setViewName("error1");

        return mv;

    }

    /**

     * java.lang.NullPointerException

     * 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常信息以及視

     圖的指定

     * 參數 Exception e:會將產生異常對象注入到方法中

     */

    @ExceptionHandler(value={java.lang.NullPointerException.class})

    public ModelAndView nullPointerExceptionHandler(Exception e){

        ModelAndView mv = new ModelAndView();

        mv.addObject("error", e.toString());

        mv.setViewName("error2");

        return mv;

    }

}

  

2. 使用 @controlleradvice 注解+@ExceptionHandler

上文說到 @ ExceptionHandler 需要進行異常處理的方法必須與出錯的方法在同一個Controller里面。那么當代碼加入了 @ControllerAdvice,則不需要必須在同一個 controller 中了。這也是 Spring 3.2 帶來的新特性。從名字上可以看出大體意思是控制器增強。 也就是說,@controlleradvice + @ ExceptionHandler 也可以實現全局的異常捕捉。

請確保此WebExceptionHandle 類能被掃描到並裝載進 Spring 容器中

@ControllerAdvice

public class GlobalException {

    /**

     * java.lang.ArithmeticException

     * 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常信息以及視圖的指定

     * 參數 Exception e:會將產生異常對象注入到方法中

     */

    @ExceptionHandler(value={java.lang.ArithmeticException.class})

    public ModelAndView arithmeticExceptionHandler(Exception e){

        ModelAndView mv = new ModelAndView();

        mv.addObject("error", e.toString()+" -- advice");

        mv.setViewName("error1");

        return mv;

    }

    /**

     * java.lang.NullPointerException

     * 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常信息以及視

     圖的指定

     * 參數 Exception e:會將產生異常對象注入到方法中

     */

    @ExceptionHandler(value={java.lang.NullPointerException.class})

    public ModelAndView nullPointerExceptionHandler(Exception e){

        ModelAndView mv = new ModelAndView();

        mv.addObject("error", e.toString()+" -- advice");

        mv.setViewName("error2");

        return mv;

    }

}

 如果 @ExceptionHandler 注解中未聲明要處理的異常類型,則默認為參數列表中的異常類型。所以還可以寫成這樣:

@ControllerAdvice
public
class GlobalExceptionHandler { @ExceptionHandler() @ResponseBody String handleException(Exception e){ return "Exception Deal! " + e.getMessage(); } }

 控制器中就只有業務處理的代碼了

@Controller

public class UserController {
    /**

     * 模擬 NullPointerException

     * @return

     */

    @RequestMapping("/show1")

    public String showInfo(){

        String str = null;

        str.length();

        return "index";

    }
    /**

     * 模擬 ArithmeticException

     * @return

     */

    @RequestMapping("/show2")

    public String showInfo2(){

        int a = 10/0;

        return "index";

    }

}

3.實現 HandlerExceptionResolver 接口 

項目中的異常需要統一處理,正常情況下,需要提前准備好一個錯誤頁面,當項目出錯了,將該頁面展示給用戶。

@Component //注意該類需要交給Spring容器管理
public class MyExceptionResolver implements HandlerExceptionResolver {

  @Override
  public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object obj,Exception ex) {
    System.out.println(ex.getMessage());
    ModelAndView mv = new ModelAndView();
    mv.setViewName("/error.jsp");
    return mv;
  }
}

  

 


免責聲明!

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



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