一、全局異常處理
//Result定義全局數據返回對象 package com.xiaobing.demo001.domain; public class Result { private Integer code; private String message; private Object data; public Integer getCode() { return code; } public String getMessage() { return message; } public Object getData() { return data; } public void setCode(Integer code) { this.code = code; } public void setMessage(String message) { this.message = message; } public void setData(Object data) { this.data = data; } public Result() { } public Result(Integer code, String message, Object data) { this.code = code; this.message = message; this.data = data; } @Override public String toString() { return "Result{" + "code=" + code + ", message='" + message + '\'' + ", data=" + data + '}'; } }
(1) RestControllerAdvice注解使用,如下全局異常示例:
注解: @RestControllerAdvice 和@ControllerAdvice 是用來修飾類的,表示為一個增強類…我們定義全局異常攔截通常是使用 @RestControllerAdvice結合 @ExceptionHandler 來捕獲絕大部分異常,然后統一返回Json形式…
//假如當傳參為0 時肯定會報錯 除數不能為0 package com.xiaobing.demo001.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("api/v1/test") public class TestExceptionController { @GetMapping("abnormal") public void testExt() { int i = 1/0; } }
//全局異常捕獲方法 package com.xiaobing.demo001.handler; import com.xiaobing.demo001.domain.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; /**異常處理類 * @author Administrator */ @RestControllerAdvice public class ExceptionsHandler { @ExceptionHandler(value = Exception.class) Result handlerException(Exception e, HttpServletRequest request) { return new Result(500,"服務器異常",""); } }
二、針對性異常捕獲
@ExceptionHandler(value = ArithmeticException.class) Result arithmeticExceptionException(ArithmeticException e, HttpServletRequest request) { return new Result(-1,"除數不能為0",""); }
三、自定義異常捕獲
//自定義異常類 package com.xiaobing.demo001.domain; public class MyException extends RuntimeException { private String code; private String msg; public String getCode() { return code; } public String getMsg() { return msg; } public void setCode(String code) { this.code = code; } public void setMsg(String msg) { this.msg = msg; } public MyException() { } public MyException(String msg) {this.msg = msg; } }
//業務代碼,MyException @RestController @RequestMapping("api/v1/test") public class TestExceptionController { @GetMapping("myException") public void testMyExcsption() { throw new MyException("自定義異常信息"); }
//捕獲我們新增的異常 @ExceptionHandler(value = MyException.class) Result myException(MyException e, HttpServletRequest request) { return new Result(-1,"自定義異常信息",""); }
四、常用異常捕獲分享
/** 運行時異常 */ @ExceptionHandler(RuntimeException.class) public Result runtimeExceptionHandler(RuntimeException ex) { return Result.error("運行時異常"); } /** 空指針異常 */ @ExceptionHandler(NullPointerException.class) public Result nullPointerExceptionHandler(NullPointerException ex) { return Result.error("空指針異常"); } /** 類型轉換異常 */ @ExceptionHandler(ClassCastException.class) public Result classCastExceptionHandler(ClassCastException ex) { return Result.error("類型轉換異常"); } /** 文件未找到異常 */ @ExceptionHandler(FileNotFoundException.class) public Result FileNotFoundException(FileNotFoundException ex) { return Result.error("文件未找到異常"); } /** 數字格式異常 */ @ExceptionHandler(NumberFormatException.class) public Result NumberFormatException(NumberFormatException ex) { return Result.error("數字格式異常"); } /** 安全異常 */ @ExceptionHandler(SecurityException.class) public Result SecurityException(SecurityException ex) { return Result.error("安全異常"); } /** sql異常 */ @ExceptionHandler(SQLException.class) public Result SQLException(SQLException ex) { return Result.error("sql異常"); } /** 類型不存在異常 */ @ExceptionHandler(TypeNotPresentException.class) public Result TypeNotPresentException(TypeNotPresentException ex) { return Result.error("類型不存在異常"); } /** IO異常 */ @ExceptionHandler(IOException.class) public Result iOExceptionHandler(IOException ex) { log.error("IO異常:{} ", ex.getMessage(), ex); return Result.error("IO異常"); } /** 未知方法異常 */ @ExceptionHandler(NoSuchMethodException.class) public Result noSuchMethodExceptionHandler(NoSuchMethodException ex) { log.error("未知方法異常:{} ", ex.getMessage(), ex); return Result.error("未知方法異常"); } /** 數組越界異常 */ @ExceptionHandler(IndexOutOfBoundsException.class) public Result indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException ex) { return Result.error("數組越界異常"); } /** sql語法錯誤異常 */ @ExceptionHandler(BadSqlGrammarException.class) public Result BadSqlGrammarException(BadSqlGrammarException ex) { return Result.error("sql語法錯誤異常"); } /** 無法注入bean異常 */ @ExceptionHandler(NoSuchBeanDefinitionException.class) public Result NoSuchBeanDefinitionException(NoSuchBeanDefinitionException ex) { return Result.error("無法注入bean"); } /** Http消息不可讀異常 */ @ExceptionHandler({HttpMessageNotReadableException.class}) public Result requestNotReadable(HttpMessageNotReadableException ex) { return Result.error("Http消息不可讀"); } /** 400錯誤 */ @ExceptionHandler({TypeMismatchException.class}) public Result requestTypeMismatch(TypeMismatchException ex) { return Result.error("服務器異常"); } /** 500錯誤 */ @ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class}) public Result server500(RuntimeException ex) { return Result.error("服務器異常"); } /** 棧溢出 */ @ExceptionHandler({StackOverflowError.class}) public Result requestStackOverflow(StackOverflowError ex) { return Result.error("棧溢出異常"); } /** 除數不能為0 */ @ExceptionHandler({ArithmeticException.class}) public Result arithmeticException(ArithmeticException ex) { return Result.error("除數不能為0異常"); } /** 其他錯誤 */ @ExceptionHandler({Exception.class}) public Result exception(Exception ex) { return Result.error("網絡連接失敗,請退出后再試"); }