1. 程式人生 > >spring 處理異常

spring 處理異常

CA xtend cep src mage 進行 tps print repos

一、將異常映射為HTTP狀態碼

(本篇所用代碼承接 構建 Spring web 應用程序中的)

首先自定義一個異常類 SpittleNotFoundException

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

/*
 * ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found") 將該異常映射為 HTTP 404 ,切返回信息為 Spittle Not Found
 
*/ @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found") public class SpittleNotFoundException extends RuntimeException { private static final long serialVersionUID = 1L; }

然後在應用中合適的時候拋出該異常

    //接受請求的輸入
    @RequestMapping(method=RequestMethod.GET)
    public List<Spittle> spittles(@RequestParam(value="max", defaultValue="30") long
max, @RequestParam(value="count", defaultValue="20") int count) { System.out.println("pppppp"); //List<Spittle> list = repository.findSpittles(Long.MAX_VALUE, 20); List<Spittle> list = null; if (list == null || list.size() <= 0) { throw new SpittleNotFoundException(); }
return list; }

瀏覽器返回如圖

技術分享圖片

二、異常的統一處理

如果在方法中頻繁的拋出同一種異常,並對其進行處理的話很繁瑣如

    try {
            //do something ......
        } catch (Exception e) {
            //do something ......
        }

這樣會繁瑣的處理同一種異常,這種情況我們可以添加一個新的方法,它會處理所有當前控制器中拋出的你所指定的異常

    @ExceptionHandler(SpittleNotFoundException.class)
    public String handkeSpittleNotFoundException() {
        return "home";
    }

加上@ExceptionHandler註解,該方法會處理當前控制器中所有的 SpittleNotFoundException 異常

但是如果多個控制器中都需要對同一種類型的異常做相同的處理呢?當然我們可以創建基類,實現這個異常處理方法,然後所有的控制器都從基類中派生。但是,有更簡單的方法,此時可以用控制器添加通知。

三、為控制器添加通知

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

/*
 * 控制器通知是任意帶有 @ControllerAdvice 註解的類, 這個類會有一個或多個如下類型的方法
 * @ExceptionHandler
 * @InitBinder
 * @ModelAttribute
 */
@ControllerAdvice
public class AppWideExceptionHandler {

    @ExceptionHandler(SpittleNotFoundException.class)
    public String handkeSpittleNotFoundException() {
        return "home";
    }
}

這樣,AppWideExceptionHandler 類就可以處理當前應用中所有控制器所拋出的 SpittleNotFoundException 異常

spring 處理異常