SpringBoot2.X使用RestControllerAdvice/ControllerAdvice拦截异常并统一处理

SpringBoot2.X使用RestControllerAdvice/ControllerAdvice拦截异常并统一处理拦截异常并统一处理

(1)为什么要定义全局异常捕获?

在写代码的时候,可能每个方法都会涉及到异常情况,通常展示到页面是这样的!!

code: 500

msg: “Failed to convert property value of type ‘java.lang.String’ to required type ‘java.lang.Integer’ for property ‘showId’; nested exception is java.lang.NumberFormatException: For input string: “eqwe””

或者是这样的页面
在这里插入图片描述

用户体验很差

那么既然未知异常不能避免,我们就对他进行处理 简单说,就是让异常在页面显示上更好看一点,让用户体验性更好一点

我们可以定义异常页 例如 404页面 500页面 401 403 页面等等

但是现在如火如荼的前后端分离模式正在每个公司进行,前后端一般都是使用json数据进行交互的 ,那么我们对不需要获取除异常以外的数据的情况下就可以使用异常全局捕获

或者项目中自己自定义了一种返回参数格式时,希望请求结果得到统一返回,如果在运行时发现了异常,也希望将异常统一返回那么这时候 RestControllerAdvice 就站了出来

(2)RestControllerAdvice注解使用:

注解: @RestControllerAdvice @ ExceptionHandler

package com.searay7.web.controller.common;

import com.searay7.common.core.domain.AjaxResult;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.beans.TypeMismatchException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
 * @author leilei
 * @version 1.0
 * @date 2020/01/20 10:21
 * @desc: 全局异常拦截 返回json数据响应
 */
@Slf4j
@RestControllerAdvice
public class ExceptionsHandler {

  /** 运行时异常 */
  @ExceptionHandler(RuntimeException.class)
  public AjaxResult runtimeExceptionHandler(RuntimeException ex) {
    log.error("运行时异常:{}", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 空指针异常 */
  @ExceptionHandler(NullPointerException.class)
  public AjaxResult nullPointerExceptionHandler(NullPointerException ex) {
    log.error("空指针异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 类型转换异常 */
  @ExceptionHandler(ClassCastException.class)
  public AjaxResult classCastExceptionHandler(ClassCastException ex) {
    log.error("类型转换异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }
  /** 文件未找到异常 */
  @ExceptionHandler(FileNotFoundException.class)
  public AjaxResult FileNotFoundException(FileNotFoundException ex) {
    log.error("文件未找到异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }
  /** 数字格式异常 */
  @ExceptionHandler(NumberFormatException.class)
  public AjaxResult NumberFormatException(NumberFormatException ex) {
    log.error("数字格式异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }
  /** 安全异常 */
  @ExceptionHandler(SecurityException.class)
  public AjaxResult SecurityException(SecurityException ex) {
    log.error("安全异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }
  /** sql异常 */
  @ExceptionHandler(SQLException.class)
  public AjaxResult SQLException(SQLException ex) {
    log.error("sql异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }
  /** 类型不存在异常 */
  @ExceptionHandler(TypeNotPresentException.class)
  public AjaxResult TypeNotPresentException(TypeNotPresentException ex) {
    log.error("类型不存在异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** IO异常 */
  @ExceptionHandler(IOException.class)
  public AjaxResult iOExceptionHandler(IOException ex) {
    log.error("IO异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 未知方法异常 */
  @ExceptionHandler(NoSuchMethodException.class)
  public AjaxResult noSuchMethodExceptionHandler(NoSuchMethodException ex) {
    log.error("未知方法异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 数组越界异常 */
  @ExceptionHandler(IndexOutOfBoundsException.class)
  public AjaxResult indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException ex) {
    log.error("数组越界异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }
  /** sql语法错误异常 */
  @ExceptionHandler(BadSqlGrammarException.class)
  public AjaxResult BadSqlGrammarException(BadSqlGrammarException ex) {
    log.error("sql语法错误异常:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 无法注入bean异常 */
  @ExceptionHandler(NoSuchBeanDefinitionException.class)
  public AjaxResult NoSuchBeanDefinitionException(NoSuchBeanDefinitionException ex) {
    log.error("无法注入bean异常 :{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 400错误 */
  @ExceptionHandler({HttpMessageNotReadableException.class})
  public AjaxResult requestNotReadable(HttpMessageNotReadableException ex) {
    log.error("400错误..requestNotReadable:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 400错误 */
  @ExceptionHandler({TypeMismatchException.class})
  public AjaxResult requestTypeMismatch(TypeMismatchException ex) {
    log.error("400错误..TypeMismatchException:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 500错误 */
  @ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class})
  public AjaxResult server500(RuntimeException ex) {
    log.error("500错误:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 栈溢出 */
  @ExceptionHandler({StackOverflowError.class})
  public AjaxResult requestStackOverflow(StackOverflowError ex) {
    log.error("栈溢出:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 除数不能为0 */
  @ExceptionHandler({ArithmeticException.class})
  public AjaxResult arithmeticException(ArithmeticException ex) {
    log.error("除数不能为0:{} ", ex.getMessage(), ex);
    return AjaxResult.error("服务器异常");
  }

  /** 其他错误 */
  @ExceptionHandler({Exception.class})
  public AjaxResult exception(Exception ex) {
    log.error("其他错误:{} ", ex.getMessage(), ex);
    return AjaxResult.error("网络连接失败,请退出后再试");
  }
}

使用RestControllerAdvice注解 即可将异常以JSON数据的形式传递给前端 其实就是 Responsebody 与 ControllerAdvice 的结合

处理后的返给前端的异常如下

{
	"head": false,
    "code": 500,
    "message": "索引越界异常",
    "data":null
}


{
	"head": false,
    "code": 404,
    "message": "请求资源不存在异常",
    "data": null
}
发布了31 篇原创文章 · 获赞 23 · 访问量 3769

猜你喜欢

转载自blog.csdn.net/leilei1366615/article/details/104052919