springmvc學習筆記(29)——HandleException處理異常
阿新 • • 發佈:2019-01-10
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
如何使用HandleException
在程式中,異常是最常見的,我們需要捕捉異常並處理它,才能保證程式不被終止。
最常見的異常處理方法就是用try catch
來捕捉異常。這次我們使用springmvc給我們提供的方法來處理異常
先模擬一個異常出現的場景。以下是一個簡單的數學異常
@RequestMapping("testExceptionHandle") public String testExceptionHandle(@RequestParam("i")Integer i){ System.out.println(10 /i); return "hello"; }
- 1
- 2
- 3
- 4
- 5
當i的值為0的時候,就會丟擲數學異常。該如何捕捉呢,我們使用ExceptionHandler註解
//注意,該註解不是加在產生異常的方法上,而是另外寫一個方法 @ExceptionHandler({ArithmeticException.class}) public String testArithmeticException(Exception e){ System.out.println("ArithmeticException:"+e); return "error"; }
- 1
- 2
- 3
- 4
- 5
- 6
- ExceptionHandler 的value屬性是一個Class 陣列,因此我們可以在該註解的屬性中加入多個異常類
- 當目標方法產生異常時,將被這個方法捕捉,我們可以得到異常的例項
- 注意,捕捉異常的方法要和目標方法在同一個controller中
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"; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
如以上程式碼所示,目標方法是testExceptionHandle,另外兩個方法被ExceptionHandler註解修飾。
訪問目標方法,讓它拋異常,看控制檯列印結果,發現它拋了ArithmeticException:java.lang.ArithmeticException: / by zero
這個異常
因此我們可以確定,ExceptionHandler的優先順序是:在異常的體系結構中,哪個異常與目標方法丟擲的異常血緣關係越緊密,就會被哪個捕捉到。
捕捉全域性的異常
ExceptionHandler只能捕捉同一個controller中的異常,其實我們也有辦法捕捉整個程式中所有的異常
新建一個類,加上@ControllerAdvice註解
package com.zj.controller;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;//處理異常@ControllerAdvicepublic class HandleForException { @ExceptionHandler({ArithmeticException.class}) public String testArithmeticException(Exception e){ System.out.println("ArithmeticException:"+e); return "error"; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
在這個類中使用ExceptionHandler,就能捕捉所有的controller中發生的異常