java微服务全局异常处理

 2023-02-25 14:33:45  阅读 0

一、为什么要用全局异常处理

当你的程序跑起来,但是sql有错就会终止你的程序,如果在公司这就很麻烦,所以你需要全局异常以方便维护。ava为什么要自定义异常用if else也可以进行判断,同样是控制台打印 为什么还要异常 而且打印异出错的可能性有很多种,有部分是你可以处理的。但很多是超出你预估的。这种异常你无法处理,这时最好的处理方式就是再将异常抛出。 至于打印异常,这只是异常处理的一种方式,有不少人会先打印异常,再将异常抛出。

二、代码实现

先创建捕获异常类


/**
 * 统一异常处理
 */
@Slf4j
@RestControllerAdvice
public class UnifiedExceptionHandler {

    /**
     * 捕获Exception异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public R handleException(Exception e) {
        log.error(e.getMessage(), e);
        return R.error();
    }

    /**
     * 捕获BadSqlGrammarException异常
     * SQL语法错误
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = BadSqlGrammarException.class)
    public R handleException(BadSqlGrammarException e) {
        log.error(e.getMessage(), e);
        return R.setResult(ResponseEnum.BAD_SQL_GRAMMAR_ERROR);
    }

    /**
     * 捕获BusinessException异常
     * 这是自定义的异常,它将处理系统中所有自己抛出的异常,通过状态码和异常信息区分异常类型
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = BusinessException.class)
    public R handleException(BusinessException e) {
        log.error(e.getMessage(), e);
        return R.error().message(e.getMessage()).code(e.getCode());
    }

    /**
     * 捕获Controller上层相关异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler({
            NoHandlerFoundException.class,
            HttpRequestMethodNotSupportedException.class,
            HttpMediaTypeNotSupportedException.class,
            MissingPathVariableException.class,
            MissingServletRequestParameterException.class,
            TypeMismatchException.class,
            HttpMessageNotReadableException.class,
            HttpMessageNotWritableException.class,
            MethodArgumentNotValidException.class,
            HttpMediaTypeNotAcceptableException.class,
            ServletRequestBindingException.class,
            ConversionNotSupportedException.class,
            MissingServletRequestPartException.class,
            AsyncRequestTimeoutException.class
    })
    public R handleServletException(Exception e) {
        log.error(e.getMessage(), e);
        return R.error().message(ResponseEnum.SERVLET_ERROR.getMessage()).code(ResponseEnum.SERVLET_ERROR.getCode());
    }
}

如上,当出现contorller层或是sql层错误会自动跳到当前异常类。

三、自定义异常类

为什么需要自定义异常类?当你的错误不是上面所包含的比如你想判断用户名字是否为空、而且能自定义返回的响应码。我们平常接触到的都是SUN公司已经写好了的异常类,我们也可以自己定义异常类,方法如下,请看代码。


    /**
     * 捕获BusinessException异常
     * 这是自定义的异常,它将处理系统中所有自己抛出的异常,通过状态码和异常信息区分异常类型
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = BusinessException.class)
    public R handleException(BusinessException e) {
        log.error(e.getMessage(), e);
        return R.error().message(e.getMessage()).code(e.getCode());
    }

接下来创建自定义的异常类

package com.wwj.common.result.exception;

import com.wwj.common.result.ResponseEnum;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class BusinessException extends RuntimeException {

    /**
     * 错误码
     */
    private Integer code;
    /**
     * 错误信息
     */
    private String message;

    /**
     * @param message 错误消息
     */
    public BusinessException(String message) {
        this.message = message;
    }

    /**
     * @param message 错误消息
     * @param code    错误码
     */
    public BusinessException(String message, Integer code) {
        this.message = message;
        this.code = code;
    }

    /**
     * @param message 错误消息
     * @param code    错误码
     * @param cause   原始异常对象
     */
    public BusinessException(String message, Integer code, Throwable cause) {
        super(cause);
        this.message = message;
        this.code = code;
    }

    /**
     * @param resultCodeEnum 接收枚举类型
     */
    public BusinessException(ResponseEnum resultCodeEnum) {
        this.message = resultCodeEnum.getMessage();
        this.code = resultCodeEnum.getCode();
    }

    /**
     * @param resultCodeEnum 接收枚举类型
     * @param cause          原始异常对象
     */
    public BusinessException(ResponseEnum resultCodeEnum, Throwable cause) {
        super(cause);
        this.message = resultCodeEnum.getMessage();
        this.code = resultCodeEnum.getCode();
    }
}

 

下一篇: Git详细讲解
标签:

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码