SpringBoot Control de excepciones (a)

ERROR: problemas serios, no podemos procesar

EXCEPCIÓN: RuntimeException compilar sin control, hay un problema que tenemos que modificar el código

No RuntimeException (CheckedException ninguna clase de excepción) debe compilar proceso, de lo contrario el programa no puede ser compilado

excepción personalizada hereda por defecto Excepition no RuntimeExcepition.

Puede ser tratada con un no-excepción RuntimeException Ejemplo: archivo de procesamiento, el error de ruta del archivo.

Impotente RuntimeException Ejemplo: solicita datos de base de datos, la base de datos hay tal datos.

En la preparación de los antecedentes, con el fin de facilitar la localización de errores de extremo frontal de forma rápida, utilizando única excepción que viene con Java no es suficiente. Es necesario para personalizar las excepciones mango.

Para facilitar la ilustración, esta respuesta de error formato unificado:

//统一错误响应
{
    code:10001
    message:xxxx
    request:GET url
}

UnifyResponse.class

@Getter
@Setter
@AllArgsConstructor
public class UnifyResponse {
    private int code;
    private String message;
    private String request;
    
}

Este artículo trastornos se clasifican en dos categorías:

  • Desconocido Excepción: Para los desarrolladores de aplicaciones para usuario y los usuarios no tienen sentido. Por lo general, los problemas de lógica de código para desarrolladores del lado del servidor.

    No requiere información detallada vuelto al front-end y los usuarios pueden mostrar un error interno del servidor unificado

  • Anomalías conocida

Definir una excepción conocida:

HttpException.class

public class HttpException extends RuntimeException {
    protected Integer code;
    protected Integer httpStatusCode = 500;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public Integer getHttpStatusCode() {
        return httpStatusCode;
    }

    public void setHttpStatusCode(Integer httpStatusCode) {
        this.httpStatusCode = httpStatusCode;
    }
}

NotFoundExcepiton.class

public class NotFoundException extends HttpException {
    public NotFoundException(int code){
        this.httpStatusCode = 404;
        this.code = code;
    }
}

Manejo de excepciones:

GlobalExceptionAdvice.class:

@ControllerAdvice
public class GlobalExceptionAdvice {

    @Autowired
    private ExceptionCodeConfiguration exceptionCodeConfiguration;

    //未知异常   错误码就直接硬编码为9999
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    //如果不加这个注解,传回前端的http状态码会显示200 ok
    @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
    public UnifyResponse handleException(HttpServletRequest req, Exception e) {
        UnifyResponse message = new UnifyResponse(9999,"服务器异常",req.getMethod() + ' ' + req.getRequestURI());
        //未知异常方便调试,产品上线可以去掉
        System.out.println(e);
        return message;
    }

    //已知异常 Http异常其中包含多种异常  错误码由程序员传入例如: throw new NotFoundException(10001);
    //为什么不和上面未知异常一样使用@ResponseHandler  因为已知异常有很多种,状态码不一样,不能直接硬编码
    //解决办法:在处理各种已知异常的类中添加http状态码,在返回的response中自己添加。使用ResponseEntity
    @ExceptionHandler(HttpException.class)
    public ResponseEntity<UnifyResponse> handleHttpException(HttpServletRequest req, HttpException e) {
        UnifyResponse message = new UnifyResponse(e.getCode(),exceptionCodeConfiguration.getMessage(e.getCode()),req.getMethod() + ' ' + req.getRequestURI());
        HttpHeaders httpHeaders = new HttpHeaders();
        HttpStatus httpStatus = HttpStatus.resolve(e.getHttpStatusCode());
        ResponseEntity<UnifyResponse> r = new ResponseEntity<>(message,httpHeaders,httpStatus);
        return r;
    }
}

clase de configuración

Conocida la información del código de error anormal y no-codificado en el uso de buenas propiedades de clase de configuración, para hacer basado en excepciones

exception-code.properties

liu.codes[0] = ok
liu.codes[999] = 服务器未知异常

liu.codes[10000] = 通用错误
liu.codes[10001] = 通用参数错误
liu.codes[10002] = 资源未找到
liu.codes[10003] = 没有找到合适的登陆处理方法
liu.codes[10004] = 令牌不合法或者过期
liu.codes[10005] = 用户未被授权
liu.codes[10006] = 登陆失败

liu.codes[20000] = 用户类通用错误
liu.codes[20001] = 用户已存在
liu.codes[20002] = 用户不存在
liu.codes[20003] = 用户密码错误
liu.codes[20004] = 获取用户wx openid失败

liu.codes[30000] = 商品类通用错误
liu.codes[30001] = 分类不存在
liu.codes[30002] = 商品信息不存
liu.codes[30003] = 主题不存在
liu.codes[30004] = complexity参数错误
liu.codes[30005] = Banner类资源不存在
liu.codes[30006] = 当前暂不支持级联获取sku-list
liu.codes[30007] = 当前暂不支持级联获取spu-list,请调用其他接口
liu.codes[30008] = 当前没有更多的商品信息了
liu.codes[30009] = Grid分类不存在
liu.codes[30010] = 请求的单品列表不存在
liu.codes[30011] = 请求的商品SaleExplain不存在

Lee las categorías de configuración:

ExceptionCodeConfiguration.class

@ConfigurationProperties(prefix = "liu")
@PropertySource(value = "classpath:/config/exception-code.properties")
@Component
public class ExceptionCodeConfiguration {

    private Map<Integer,String> codes =new HashMap<>();

    public Map<Integer, String> getCodes() {
        return codes;
    }

    public void setCodes(Map<Integer, String> codes) {
        this.codes = codes;
    }

    public String getMessage(int code){
        return codes.get(code);
    }
}

Resuelve los chinos ilegible propiedades lectura

idea:

  • Archivo-> Configuración-> Propiedades de codificación de archivos de archivos a la codificación UTF-8 y transparente tic-nativa a ASCII.
  • Después de las propiedades anteriores pueden operar todos los archivos ilegibles, elimine el contenido volver a entrar en ella.

Supongo que te gusta

Origin www.cnblogs.com/chauncyL/p/12535971.html
Recomendado
Clasificación