SpringBoot 全局異常攔截捕獲處理


一、全局異常處理

//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("網絡連接失敗,請退出后再試");
    }


免責聲明!

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



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