• SpringBoot 为API添加统一的异常处理(一)


    首先我把异常分为两种,一种是可控制的,或者是由我们发现条件不正确主动抛出的异常,就像前城市编号不存在那个粟子;另一种是不可控制的,或者说是程序存在bug引起的异常,但这种异常也不想变态的就直接给前端抛出个500异常。

    实现步骤如下:

    第1步,新建一个Exception类

    新建一个 DescribeException 类,在主动抛出异常时就抛出一个 DescribeException 类实例。它包含两个属性 code和message 。code是要抛出的异常代码用http状态码来表示,message是想要告诉前端的信息,如“参数验证错误”之类的。

    /**
     * Name:RESTException
     * Description: 异常信息
     */
    public class DescribeException extends Exception {
    int code;//状态代码 String message;//异常提示信息 public int getCode() { return code; } public void setCode(int code) { this.code = code; } @Override public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }

    第2步,建一个异常拼接器

    创建一个异常处理器,它有两个异常处理方法,一个处理主动抛出的异常,一个处理非主动异常。

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * Name:APIExceptionHandler
     * Description:
     */
    @ControllerAdvice
    public class APIExceptionHandler {
    Logger logger
    = LoggerFactory.getLogger(this.getClass()); /** * 处理业务发现问题主动抛出的异常 * @param request * @param e * @return * @throws Exception */ @ExceptionHandler(value = DescribeException.class) @ResponseBody public ResponseEntity<DescribeException> baseErrorHandler(HttpServletRequest request, DescribeException e) throws Exception { //把错误输出到日志 logger.error("DescribeException Handler---Host: {} invokes url: {} ERROR: {}", request.getRemoteHost(), request.getRequestURL(), e.getMessage()); return new ResponseEntity<DescribeException>(e, HttpStatus.valueOf(e.getCode())); } /** * 系统抛出的没有处理过的异常 * @param request * @param e * @return * @throws Exception */ @ExceptionHandler(value = Exception.class) @ResponseBody public ResponseEntity<Exception> defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception { //把错误输出到日志 logger.error("DefaultException Handler---Host: {} invokes url: {} ERROR: {}", request.getRemoteHost(), request.getRequestURL(), e.getMessage()); return new ResponseEntity<Exception>(new Exception("参数验证错误!"), HttpStatus.INTERNAL_SERVER_ERROR); } }

    主异常处理方法将传递业务处理中的异常提示信息给前端,非主动异常处理方法将统一返回一种异常提示信息到前端。

    第3步,在业务中抛出自定义异常

    thow new DescribeException(HttpStatus.INTERNAL_SERVER_ERROR.value(),"自定义错误信息");
  • 相关阅读:
    DNS正向解析实现
    基于bind软件部署DNS服务器
    DNS解析工具使用案例
    DNS服务工作原理
    3
    .deb/.whl/.tgz/.tar/gz软件包安装方式(Ubuntu)
    博客系列目录
    Databricks 第3篇:pyspark.sql 通过JDBC连接数据库
    Databricks 第2篇:pyspark.sql 简介
    数据预处理 第4篇:数据预处理(sklearn 插补缺失值)
  • 原文地址:https://www.cnblogs.com/rinack/p/11317077.html
Copyright © 2020-2023  润新知