1. 程式人生 > >springmvc學習筆記(29)——@ExceptionHandle 註解

springmvc學習筆記(29)——@ExceptionHandle 註解

HandleException的優先順序
當一個controller中有多個HandleException註解出現時,那麼異常被哪個方法捕捉呢?這就存在一個優先順序的問題   

@ExceptionHandler({ArithmeticException.class})
    public String testArithmeticException(Exception e){
        System.out.println("ArithmeticException:"+e);
        return "error";
    }

    @ExceptionHandler({RuntimeException.class})
    public String testRuntimeException(Exception e){
        System.out.println("RuntimeException"+e);
        return "error";
    }

    @RequestMapping("testExceptionHandle")
    public String testExceptionHandle(@RequestParam("i")Integer i){
        System.out.println(10/i);
        return "hello";
    }


如以上程式碼所示,目標方法是testExceptionHandle,另外兩個方法被ExceptionHandler註解修飾。

因此我們可以確定,ExceptionHandler的優先順序是:在異常的體系結構中,哪個異常與目標方法丟擲的異常血緣關係越緊密,就會被哪個捕捉到。

捕捉全域性的異常
ExceptionHandler只能捕捉同一個controller中的異常,其實我們也有辦法捕捉整個程式中所有的異常

新建一個類,加上@ControllerAdvice註解
 

package com.zj.controller;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

//處理異常
@ControllerAdvice
public class HandleForException {

    @ExceptionHandler({ArithmeticException.class})
    public String testArithmeticException(Exception e){
        System.out.println("ArithmeticException:"+e);
        return "error";
    }
}