Proyecto de educación en línea [Manejo unificado de excepciones]

Tabla de contenido

1. Manejo unificado de excepciones

¿Por qué las excepciones deben manejarse de manera uniforme? 

1.1: Probar la respuesta del sistema a las excepciones

Dos formas de manejar las excepciones globalmente

La primera forma: intente... atrapar para manejar excepciones    

La segunda forma: configurar la clase de manejo de excepciones

1.3: Configuración especial de manejo de excepciones

1.4: Excepciones personalizadas

1.4.1: Clase de excepción genérica EduException

1.4.2: Crear una clase de excepción personalizada catch

1.4.3: Clase de herramienta de excepción


1. Manejo unificado de excepciones

¿Por qué las excepciones deben manejarse de manera uniforme? 

Cuando un usuario está experimentando con un producto, si hay un problema con el producto, se informará un error, como: 400, 404, 403, 500, e informar esta excepción al usuario es demasiado Causa un usuario muy malo experiencia, pero es inevitable que ocurran excepciones Aquí, la captura y el procesamiento de excepciones unificadas se llevan a cabo para brindar indicaciones fáciles de usar

1.1: Probar la respuesta del sistema a las excepciones

Por ejemplo: En el servicio de profesores, cuando agregamos un disertante, el tiempo no se agrega según el formato [yyyy-MM-dd HH:mm:ss],

El programa de demostración informa un error:

Dos formas de manejar las excepciones globalmente

La primera forma: intente... atrapar para manejar excepciones    

El error del programa se ha demostrado anteriormente, y luego lo resolvemos intentando atrapar

Este problema ocurre al agregar un controlador de maestro en el servicio de maestro. Hago una excepción al método de agregar un maestro en el controlador. Intente ... atrapar

    @ApiOperation("添加老师")
    @PostMapping
    public BaseResult addteacher(@RequestBody EduTeacher eduTeacher){
        boolean flag = false;
        try {
            flag = eduTeacherService.save(eduTeacher);
            throw new RuntimeException("报错了");
        } catch (Exception e) {
          return BaseResult.error("系统错误");
        }
     
    }

La excepción se captura con éxito aquí 

Pero si se usa la excepción de cada método, intente, el costo es demasiado y es muy problemático. Podemos hacer el procesamiento global de la segunda manera.

La segunda forma: configurar la clase de manejo de excepciones

  • proporcionado por spring mvc@RestControllerAdvice注解

  • @ControllerAdviceEs una anotación que realza el Controlador Tiene tres funciones principales:

    1. Manejo de excepciones globales (*)

    2. enlace de datos globales

    3. preprocesamiento de datos globales

En el módulo común: configurar clases de manejo de excepciones en el módulo zx_common_practise

 Nota: Para que esta clase de configuración se cargue con éxito, la clase de arranque de resorte debe escanearse para

De esta manera, TeacherApplication puede escanear con éxito el paquete de excepción escrito 

@RestControllerAdvice  // 对Controller进行增强也就是说进行处理,
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)//拦截什么异常
    public BaseResult error(Exception e){
        e.printStackTrace();
        return BaseResult.error("系统错误");
    }

 Echa un vistazo al efecto:

Simule una excepción de división por 0 y simule una excepción de división por 0 en el método de consulta de todos los maestros

    @GetMapping
    @ApiOperation("查询所有老师")
    public BaseResult findAll(){

        List<EduTeacher> list = eduTeacherService.list();
        //添加一个除0异常
        int exception = 1/0;
        return BaseResult.ok("查询成功",list);
    }

 Prueba de Swagger: el error del sistema se captura con éxito aquí

Nota: @RestControllerAdvice y @controllerAdvice tienen el mismo significado que @ResponseBody

Esto es equivalente a agregar un intento... atrapar a cada método en la clase del controlador. 

Después de que la excepción se maneje en el desarrollo futuro, no será visible. Dos formas de obtener información de excepción

Opción 1: Procesamiento simple del nodo de desarrollo, imprimiendo la excepción a la consola

Opción 2: Construir el entorno. Use [log log] para registrar excepciones

1.3: Configuración especial de manejo de excepciones

¿Qué significa configuración especial de manejo de excepciones? En pocas palabras, es más preciso manejar excepciones

En la siguiente figura, intente... capturar la excepción en el método del controlador. Es la misma excepción y la excepción más grande que la excepción en la excepción de configuración unificada. Todos sabemos que la excepción puede capturar varias excepciones en la figura de la izquierda a continuación. , y la precisión es más cuidadosa. Al igual que Exception es la excepción más grande, ¡podemos capturar la excepción con mayor precisión!

 Capture y procese con precisión las excepciones en la clase de configuración de excepciones. La siguiente es una demostración de la excepción excepto por 0

Se puede ver que la excepción excepto 0 es: ArithmeticException, que se captura especialmente en la clase de manejo de excepciones para un procesamiento preciso

 

1.4: Excepciones personalizadas

Al igual que el manejo de excepciones unificado global anterior y el manejo de excepciones especiales ya pueden manejar los problemas más comunes

¿Por qué hay una excepción personalizada? Y las excepciones personalizadas seguirán representando la mayor parte del desarrollo futuro

Por ejemplo:

Si escribe una función para agregar usuarios, el método se implementa en Serive y el éxito o el fracaso de la adición puede devolver un valor booleano verdadero o falso, que es la lógica normal.

Ahora hay un usuario complicado agregado. Antes de agregar, el jefe quiere que determine si el nombre de usuario existe o el género de la contraseña, y realice una ola de verificación. Una vez que se completa la verificación, puede que no sea verdadero/falso, pero se puede devolver una cadena. , puede devolver un objeto, entonces la excepción jugará un papel, porque la excepción puede llevar información, y se puede lanzar una excepción directamente después de la verificación en la capa de Servicio. El procesamiento del juicio de verificación se completa !

Si intenta en la capa del controlador, obviamente es redundante probar cada método, de modo que se realice el manejo global de excepciones.

1.4.1: Clase de excepción genérica EduException

 Lanzar excepciones personalizadas en el Servicio para el manejo de excepciones, ¿cómo debo elegir?

Excepción personalizada: excepción en tiempo de compilación, excepción en tiempo de ejecución RuntimeException

Las excepciones en tiempo de ejecución todavía se usan en la mayoría de los casos, porque las excepciones en tiempo de compilación se declaran en los métodos y cada llamador debe manejarlas. ¡Problema!

Excepciones de tiempo de ejecución, cuando lo intenta, no sabe si las excepciones generadas por el propio sistema o las excepciones que personaliza cuando las captura, porque muchas excepciones de tiempo de ejecución incluyen una amplia gama y es difícil distinguir si es su propia definición. El Runtime sigue siendo el Runtime producido por el sistema, ¿qué debo hacer?

Para resolver el problema, podemos heredar las excepciones de Runtime y usar sus subclases, y usar subclases para lanzar nuestras propias excepciones personalizadas, lo cual es una buena solución.

ejemplo de código 

Cree una clase de excepción EduException personalizada en zx_common_practise

1.4.2: Crear una clase de excepción personalizada catch

  • Prueba: Lance EduException en la posición requerida en el negocio, por ejemplo, un error en la lista de consultas:

    @GetMapping
    @ApiOperation("查询所有老师")
    public BaseResult findAll(){
        if (true){
        //    throw new RuntimeException("我就是运行时异常");  
            //    如果按照这种进行抛出压根不知道是自定义的异常抛出还是系统的运行时异常抛出
            throw new EduException("我是自定义异常");
        }
        List<EduTeacher> list = eduTeacherService.list();
        return BaseResult.ok("查询成功",list);
    }
  • Agregue un método de controlador personalizado a la clase GlobalExceptionHandler

    @ExceptionHandler(EduException.class)
    public BaseResult error(EduException e){
        e.printStackTrace();
        return BaseResult.error(e.getMessage());
    }

1.4.3: Clase de herramienta de excepción

 

¿Para qué sirve esta herramienta?

Lanzar una excepción personalizada en lo anterior requiere una nueva excepción: como se muestra arriba

Extraemos el proceso de esta nueva excepción en una clase de herramienta, de modo que no necesitemos volver a crearlo cada vez.

Llame al método en la clase de herramienta directamente

 

 Clase de herramienta: código fuente

public class ExceptionUtils {
    /**
     * 抛出异常
     * @param message
     */
    public static void cast(String message) {
        throw new EduException(message);
    }
}

Supongo que te gusta

Origin blog.csdn.net/m0_64550837/article/details/126680226
Recomendado
Clasificación