Spring-boot-route (cuatro) manejo de excepciones globales

En el desarrollo, a menudo usamos try/catch块para capturar excepciones para su procesamiento. Si algunos códigos se olvidan de capturar excepciones o aparecen algunas excepciones invisibles, responderán a algunas solicitudes no amigables en la interfaz. En este momento, podemos usar el manejo de excepciones globales. De esta forma, no hay necesidad de escribir esas cosas molestas en el try/catch块了código, y se mejorará la legibilidad del código.

Las anotaciones proporcionadas por SpringBoot @ControllerAdviceindican que la captura de excepciones globales está habilitada y se utiliza en métodos de excepción personalizados ExceptionHandlerpara el procesamiento unificado.

¡Echemos un vistazo a cómo manejar las excepciones globales con elegancia!

Una clase de enumeración que define información y códigos de estado de respuesta

@Getter
public enum CodeEnum {

    SUCCESS(0,"请求成功"),
    ERROR(500,"未知异常"),
    ERROR_EMPTY_RESULT(1001,"查询结果为空"),
    ERROR_INCOMPLETE_RESULT(1002,"请求参数不全");

    private int code;
    private String message;
    CodeEnum(int code,String message){
        this.code = code;
        this.message = message;
    }
}

Dos definen la clase de entidad de los datos de respuesta

@Slf4j
@Data
public class R<T> implements Serializable {

    private static final long serialVersionUID = 572235155491705152L;
    /**
     * 响应的状态码
     */
    private int code;
    /***
     * 响应的信息
     */
    private String message;
    /**
     * 响应数据
     */
    private T data;

    /**
     * 放入响应码并返回
     * @param code
     * @param msg
     * @return
     */
    public R fillCode(int code,String msg){
        this.code = code;
        this.message = msg;
        return this;
    }

    /**
     * 放入响应码并返回
     * @param codeEnum
     * @return
     */
    public R fillCode(CodeEnum codeEnum){
        this.code = codeEnum.getCode();
        this.message = codeEnum.getMessage();
        return this;
    }

    /**
     * 放入数据并响应成功状态
     * @param data
     * @return
     */
    public R fillData(T data){
        this.code = CodeEnum.SUCCESS.getCode();
        this.message = CodeEnum.SUCCESS.getMessage();
        this.data = data;
        return this;
    }
}

Tres excepciones personalizadas

Personalice las excepciones según las necesidades comerciales. En este artículo, definí dos excepciones, que se utilizan para manejar cuando el resultado de la respuesta está vacío y cuando el parámetro de solicitud es incorrecto.

@Data
public class EmptyResutlException extends RuntimeException {

    private static final long serialVersionUID = -8839210969758687047L;
    private int code;
    private String message;

    public EmptyResutlException(CodeEnum codeEnum){
        this.code = codeEnum.getCode();
        this.message = codeEnum.getMessage();
    }
}
@Data
public class RequestParamException extends RuntimeException {

    private static final long serialVersionUID = 4748844811214637041L;
    private int code;
    private String message;

    public RequestParamException(CodeEnum codeEnum){
        this.code = codeEnum.getCode();
        this.message = codeEnum.getMessage();
    }
}

Cuatro definen la clase de manejo de excepciones globales

Porque aquí quiero responder a los resultados para el objeto de clase de entidad, por lo que directamente en @RestControllerAdvicelugar de @ControllerAdvice, anoté con la diferencia entre los dos @Controllery @RestController, como el resto del cuerpo, en respuesta al formato de datos json.

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 查询结果为空时处理
     * @param e
     * @return
     */
    @ExceptionHandler(EmptyResutlException.class)
    public R emptyResultExceptionHandler(EmptyResutlException e){
        log.error("查询结果为空:{}",e.getMessage());
        R result = new R();
        result.fillCode(e.getCode(),e.getMessage());
        return result;
    }

    /**
     * 请求参数错误时处理
     * @param e
     * @return
     */
    @ExceptionHandler(RequestParamException.class)
    public R requestParamExceptionHandler(RequestParamException e){
        log.error("请求参数不合法:{}",e.getMessage());
        R result = new R();
        result.fillCode(e.getCode(),e.getMessage());
        return result;
    }

    /**
     * 处理其他异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public R exceptionHandler(Exception e){
        log.error("未知异常:{}",e.getMessage());
        R result = new R();
        result.fillCode(CodeEnum.ERROR);
        return result;
    }
}

Cinco excepciones de prueba de interfaz personalizada

@RestController
public class TestController {

    @GetMapping("getString")
    public R getString(String name){

        if(StringUtils.isEmpty(name)){
            throw new RequestParamException(1002,"请求参数name为空");
        }else if ("Java旅途".equals(name)) {
            // 这里没有查询操作,当请求参数是Java旅途的时候,模拟成查询结果为空
            throw new EmptyResutlException(1001,"查询结果为空");
        }
        // 这里模拟一下除自定义异常外的其他两种异常
        int i = 0;
        i = 5/i;
        return new R().fillData(name);
    }
}

En el desarrollo real, puede personalizar las clases de enumeración y las excepciones personalizadas que responden a los códigos de estado para satisfacer sus necesidades.

Este es el cuarto artículo de la serie spring-boot-route. Los artículos de esta serie son relativamente simples. El objetivo principal es ayudar a los estudiantes que son nuevos en Spring Boot a tener una comprensión sistemática. Este artículo ha sido incluido en mi github , ¡bienvenidos amigos star!

github : https://github.com/binzh303/spring-boot-route

Presta atención, no te pierdas

Si te sientes bien ensayos, atención bienvenida , aprobación , colección , tu apoyo es mi poder creativo, gracias.

Si hay algún problema con la redacción del artículo, no sea tacaño. Deje un mensaje y indíquelo. Lo comprobaré y modificaré a tiempo.

Si quieres conocerme más profundamente, puedes buscar " Java Journey " en WeChat para seguir. Responda " 1024 " para obtener videos de aprendizaje y libros electrónicos exquisitos. Envíe artículos técnicos a tiempo a las 7:30 todos los días, para que no esté solo en su camino al trabajo, y hay actividades mensuales de entrega de libros para ayudarlo a mejorar su poderío.

Supongo que te gusta

Origin blog.51cto.com/14820531/2539994
Recomendado
Clasificación