SSM 統一異常處理


SSM 統一異常處理

spring創建中, 處理異常可以使用try-cache處理, 也可以使用spring提供的統一異常處理

在spring中, 統一處理異常有2中方式

  1. 注解方式

    @ExceptionHandler 作用於方法上

    @controlleradvice 作用於類上

  2. 接口方式

    HandlerExceptionResolver 接口

注解方式

注解方式用起來也是比較方便的, 注解方式有兩種

  1. @ExceptionHandler單獨使用, 前提是拋出異常的方法和處理異常的方法在同一個controller下
  2. @controlleradvice@ExceptionHandler 配合使用, 如果當前controller下沒有處理異常的方法, 則去找@controlleradvice描述的類下面處理異常的方法

單獨使用@ExceptionHandler

此方式僅限於處理異常的方法和拋出異常的方法在同一個controller里

次注解的參數是可以處理異常的類型字節碼對象, 例如寫RuntimeException.class則處理此異常以及其子類的異常, 處理異常的方法參數和注解的參數類型一般來說是一致的.

@Controller
public class GlobalController {

   /**
     * 用於處理異常的
     */
    @ExceptionHandler({MyException.class})
    public String exception(MyException e) {
        System.out.println(e.getMessage());
        e.printStackTrace(); // 控制台打印報錯信息
        return "exception";
    }

    // 此請求會拋出異常
    @RequestMapping("/index")
    public String test() {
        throw new MyException("出錯了!");
        return "index";
    }
} 

使用 @ControllerAdvice+ @ ExceptionHandler 注解

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

/**
 * @ControllerAdvice 注解描述的類, spring mvc會分為他是
 * 	一個控制層全局異常的處理
 */
@ControllerAdvice
public class GlobalExceptionHandler {
	
	/**
	 * @ExceptionHandler 注解描述的方法為異常處理方法,
	 * 	次注解中定義的異常類型, 為這個方法可以處理的異常類型, 它可以處理
	 * 	此異常以及這個異常類型的子類類型的異常
	 * @param e
	 * @return
	 */
	@ExceptionHandler(RuntimeException.class)
	@ResponseBody // 告訴spring mvc最終相應結果轉換為json格式返回, 如果返回的是頁面可不寫次注解
	public JsonResult doHandleRuntimeException(RuntimeException e) {
		e.printStackTrace();
		return new JsonResult(e);
	}
    
    // .....等多個處理異常的方法
}

實現 HandlerExceptionResolver 接口

即mvc中所有的異常都可以在這里進行處理

@Component
public class ExceptionTest implements HandlerExceptionResolver{

    /**
     * TODO 簡單描述該方法的實現功能(可選).
     * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
     */
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) {
        System.out.println("This is exception handler method!");
        return null;
    }
}


免責聲明!

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



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