在系統開發過程中,異常處理是不可避免,如果異常處理不好,會給用戶造成很差的體驗,本文主要講解在SpringMVC開發過程中,異常處理的相關知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
在系統開發過程中,異常處理是不可避免,如果異常處理不好,會給用戶造成很差的體驗,本文主要講解在SpringMVC開發過程中,異常處理的相關知識點,僅供學習分享使用,如有不足之處,還請指正。
概述
在SpringMvc中,處理異常有好幾種方法,本文主要講解兩種方案:
- 通過@ExceptionHandler來進行異常的捕獲接收並處理。
- 通過@ResponseStatus註解來進行返回狀態碼內容的自定義處理。
通過@ExceptionHandler操作步驟
1. 自定義一個異常類,繼承自Exception類
如下所示:@ExceptionHandler標註在方法上,表示此方法可以用來處理異常,如果有多個異常需要捕獲,則用逗號隔開。
如果需要捕獲其他類的異常,則需要在類上增加@ControllerAdvice註解。
1 package com.hex.third; 2 3 import org.springframework.web.bind.annotation.ControllerAdvice; 4 import org.springframework.web.bind.annotation.ExceptionHandler; 5 import org.springframework.web.servlet.ModelAndView; 6 7 /** 8 * 自定義異常 9 * @author Administrator 10 * 11 */ 12 13 @ControllerAdvice 14 public class MyException extends Exception { 15 16 /** 17 * 該方法可以捕獲本類中拋出的ArithmeticException異常,可以支持多個異常 18 * @param ex 要捕獲的一樣,此方法必須只有一個參數,如果有其他類型的參數,則會報錯 19 * @return 20 */ 21 @ExceptionHandler({ArithmeticException.class,ArrayIndexOutOfBoundsException.class,MyArrayOutofBoundsException.class}) 22 public ModelAndView handlerException(Exception ex){ 23 //將ex信息在後臺輸出 24 System.out.println(ex.getMessage()); 25 //將錯誤信息顯示在前臺 26 ModelAndView mav=new ModelAndView(); 27 mav.setViewName("error"); 28 mav.addObject("exce", ex); 29 return mav; 30 } 31 }
2. 定一個方法,拋出一個數學異常,則可以進行捕獲,並顯示到錯誤頁面
1 package com.hex.third; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.ControllerAdvice; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.servlet.ModelAndView; 7 8 @Controller 9 public class Exce2Controller { 10 11 /** 12 * 拋出一個異常 13 * @return 14 */ 15 @RequestMapping("/helloexce2") 16 public ModelAndView HelloExce2(){ 17 try{ 18 int i=1/0 ; 19 }catch(ArithmeticException ex){ 20 throw ex; 21 } 22 ModelAndView mav=new ModelAndView(); 23 mav.addObject("helloexce","hello exception"); 24 mav.setViewName("success"); 25 return mav; 26 } 27 }
3. 運行測試
輸出錯誤頁面,如下所示:
通過@ResponseStatus,返回錯誤信息,操作步驟
1. 自定義一個異常類,並增加@ResponseStatus註解
如下所示:value表示狀態碼,是枚舉類型,reason顯示狀態信息
1 package com.hex.third; 2 3 import org.springframework.http.HttpStatus; 4 import org.springframework.web.bind.annotation.ResponseStatus; 5 6 /** 7 * 自定義異常類 8 * @author Administrator 9 * @ResponseStatus即可以表示在類前面,也可以表識在方法前面 10 * 11 */ 12 @ResponseStatus(value=HttpStatus.FORBIDDEN,reason="頁面禁止訪問22222") 13 public class MyArrayOutofBoundsException extends Exception { 14 15 }
2. 定義一個方法拋出該異常
如下所示:
1 /** 2 * 測試第三個異常 3 * @return 4 * @throws MyArrayOutofBoundsException 5 */ 6 @RequestMapping("/helloexce3") 7 public ModelAndView HelloExce3() throws MyArrayOutofBoundsException{ 8 if(true){ 9 throw new MyArrayOutofBoundsException(); 10 } 11 ModelAndView mav=new ModelAndView(); 12 mav.addObject("helloexce","hello exception"); 13 mav.setViewName("success"); 14 return mav; 15 }
3. 運行測試
如下所示:Message即為自定義信息
4. 註意:@ExceptionHandler和@ResponseStatus這兩種處理異常的方法,不可以同時存在。
關於異常解析的分類,如下所示:用到的時候,可以多研究一下。
備註
不論是獅子還是羚羊,都要奔跑;不論是貧窮還是富有,都要奮鬥。