2021-07-17

自定义异常&全局异常处理

异常篇

自定义异常

没有定义异常时,代码如下:

@PostMapping
    public AjaxResult addUser(@Validated @RequestBody SysUser user) {
        try {
            userService.insertUser(user);
            return AjaxResult.success();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error(e.getMessage());
        }
    }

此时,如果代码报错,会直接返给用户错误信息,我们无法定义这个错误,用户看不懂且不美观。
自定义一个全局异常:

/**
 * 全局异常
 *      继承 RuntimeException 类
 *      将异常信息message交给父类处理
 */
public class GlobalException extends RuntimeException {

    public GlobalException(String message) {
        super(message);
    }
}

然后在代码中体现自定义异常:

@PostMapping
    public AjaxResult addUser(@Validated @RequestBody SysUser user) {
        try {
            userService.insertUser(user);
            return AjaxResult.success();
        } catch (GlobalException e) {
            e.printStackTrace();
            // 这个 e 信息可以由我们定义,然后返回给用户
            return AjaxResult.error(e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("服务器故障~");
        }
    }

但是如果有多种校验,或者异常的话,代码就会很臃肿,所以此时就需要定义全局异常!

全局异常

定义一个全局异常类:

/**
 * 我们需要在controller执行之后,报错了,再执行这个类的方法去处理异常
 */
//@ControllerAdvice  : 这个注解打在类上,这个类就可以在其他controller执行前后去做一些事情(AOP思想)
@RestControllerAdvice
public class GlobalExceptionHandler {

    /*
     * 异常拦截,如果controller中出现此方法的异常则被此方法拦截
     */
    //@ExceptionHandler : 异常拦截注解
    @ExceptionHandler(value = GlobalException.class)
    public AjaxResult handlerGlobalException(GlobalException e) {
        // 打印异常供程序员排查
        e.printStackTrace();
        // 返给用户的异常信息
        return AjaxResult.error("错误异常1");
    }

    @ExceptionHandler(value = Exception.class)
    public AjaxResult handlerException(Exception e) {
        e.printStackTrace();
        return AjaxResult.error("系统错误~");
    }
}

此时,接口中不再需要 try catch:

@PostMapping
    public AjaxResult addUser(@Validated @RequestBody SysUser user) {
        userService.insertUser(user);
        return AjaxResult.success();
    }

注意 :全局异常需要能被主启动类扫描到(即主启动类所在的路径必须 在全局异常之上或者平级),如果实在无法扫描到,可以在主启动类上添加注解:

// 强制导入一个类
@Import(GlobalExceptionHandler.class)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值