1、springboot異常處理默認狀況,SpringBoot 提供兩種不一樣響應方式html
一種是瀏覽器客戶端請求一個不存在的頁面或服務端異常時,SpringBoot默認會響應一個html
前端
另外一種是使用postman
等調試工具請求不存在的url或服務端異常時,默認返回json信息面試
通常咱們不會將錯誤信息返回前端,本身去try catch
捕獲異常,但有個問題:每一個方法都這樣捕獲異常,確定是不合適,這是咱們就須要全局的異常處理了。spring
@RestController public class ExceptionController { @GetMapping("exceptionA") public void methodA() { try { int a = 100 / 0; } catch (Exception e) { e.printStackTrace(); } } }
使用@EceptionHandle
註解實現某個類的局部異常處理數據庫
@RestController public class ExceptionController { @GetMapping("exceptionA") public void methodA() { int a = 100 / 0; } /** * 局部異常處理 */ @ExceptionHandler(Exception.class) public String exHandler(Exception e) { // 判斷髮生異常的類型是除0異常則作出響應 if (e instanceof ArithmeticException) { return "發生了除0異常"; } // 未知的異常作出響應 return "發生了未知異常"; } }
使用@ControllerAdvice
+@ExceptionHandler
註解實現全局異常處理json
自定義一個異常類設計模式
@RestControllerAdvice public class DefaultException { @ExceptionHandler({NullPointerException.class}) public String exception(NullPointerException exception) { return "空指針異常"; } @ExceptionHandler({IndexOutOfBoundsException.class}) public String exception(IndexOutOfBoundsException exception) { return "數組越界異常"; } }
增長一個異常方法測試,因爲局部異常優先級更高先註釋掉了數組
@RestController public class ExceptionController { @GetMapping("exceptionA") public void methodA() { int a = 100 / 0; } @GetMapping("exceptionB") public void methodB() { List list = new ArrayList<>(); System.out.println(list.get(0)); } /** * 局部異常處理 */ //@ExceptionHandler(Exception.class) //public String exHandler(Exception e) { // // 判斷髮生異常的類型是除0異常則作出響應 // if (e instanceof ArithmeticException) { // return "發生了除0異常"; // } // // 未知的異常作出響應 // return "發生了未知異常"; //} }
全局異常註解已生效瀏覽器
自定義異常只須要繼承exception
類或其子類springboot
@Data @NoArgsConstructor public class CustomException extends Exception { private static final long serialVersionUID = 1L; private Integer code; private String mes; /** * @param code 狀態碼 * @param msg 異常返回信息 * @description 構造器 */ public CustomException(Integer code, String msg) { super(msg); this.code = code; } }
使用時能夠直接拋出異常對象
@GetMapping("exceptionC") public void methodC() throws CustomException { int a = 1; if (a == 1) { throw new CustomException(10086, "自定義異常"); } }
實際開發中咱們須要封裝統一的響應對象,區分狀態碼和信息,以便前端處理。
通常包含狀態碼,錯誤信息,數據等。
自定義一些方法用來返回信息,好比我定義的success(),failed()方法
@Data @NoArgsConstructor @AllArgsConstructor public class R<T> { /** * 返回狀態碼 */ private Integer code; /** * 返回信息 */ private String msg; /** * 數據 */ private T data; public static R success() { return new R(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), null); } public static R success(Object data) { return new R(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), data); } public static R failed() { return new R(ResultCode.FAILED.getCode(), ResultCode.FAILED.getMsg(), null); } public static R failed(String msg) { return new R(ResultCode.FAILED.getCode(), msg, null); } public static R failed(int code, String msg) { return new R(code, msg, null); } }
枚舉一些經常使用的狀態信息
我就舉個例子,只枚舉2個,根據須要去自定義
@NoArgsConstructor @AllArgsConstructor public enum ResultCode { SUCCESS(200, "請求成功"), FAILED(500, "服務器錯誤"); private int code; private String msg; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
使用時直接返回定義的對象類型就好了,將定義的全局異常返回類型也改爲統一的響應對象
@RestControllerAdvice public class DefaultException { @ExceptionHandler({CustomException.class}) public R exception(CustomException e) { return R.failed(e.getCode(),e.getMessage()); } @ExceptionHandler({Exception.class}) public R exception(Exception e) { return R.failed(e.getMessage()); } }
一直想整理出一份完美的面試寶典,可是時間上一直騰不開,這套一千多道面試題寶典,結合今年金三銀四各類大廠面試題,以及 GitHub 上 star 數超 30K+ 的文檔整理出來的,我上傳之後,毫無心外的短短半個小時點贊量就達到了 13k,說實話仍是有點難以想象的。
須要完整版的小夥伴,能夠一鍵三連後,點擊這裏!
內容涵蓋:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技術棧(485頁)
內容涵蓋:Java基礎、JVM、高併發、多線程、分佈式、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、數據庫、雲計算等
因爲篇幅限制,詳解資料太全面,細節內容太多,因此只把部分知識點截圖出來粗略的介紹,每一個小節點裏面都有更細化的內容!
須要完整版的小夥伴,能夠一鍵三連後,點擊這裏!