温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringBoot项目实战之统一(全局、特殊、自定义)异常处理

发布时间:2020-08-01 17:52:51 来源:网络 阅读:529 作者:lindaxia 栏目:编程语言
一、应用场景

  当程序出现错误时,我们不希望页面直接返回“404”、“500”等信息,为了提高用户体验,我们需要统一处理异常,进行友好的提示!

SpringBoot项目实战之统一(全局、特殊、自定义)异常处理

二、异常分类

  (1)统一异常处理:推荐,只要出现异常,返回统一结果。

  (2)特殊异常处理:一般不使用,因为无法准确定位到项目的异常。

  (3)自定义异常处理:自己创建异常,实现返回结果,需要手动调用(try...catch)才会执行!

三、实现代码

   异常实现的底层原理AOP(面向切面编程),即不改变原有的代码,实现某个功能。

  <font color=red>注意:特殊异常处理的优先级高于统一异常处理!</font>

/**
 * @BelongProjecet: guli-framework-parent
 * @BelongPackage: com.guliedu.eduservice.handler
 * @ClassName: GlobalExceptionHandler
 * @Description: 【推荐>方式一】统一异常处理:只要出现异常,返回统一结果
 *               【方式二】特殊异常处理:如果出现ArithmeticException异常,才会处理
 *                          特殊异常处理>统一异常处理(优先级)
 *               【推荐>方式三】自定义异常处理:自己创建异常,自己实现返回结果
 * @Copyright: 2019-xxx-Powered by 研发四部
 * @Author: LinHong
 * @CreateDate: 2019/11/13 20:42
 * @Version: V1.0
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 功能描述
     *
     * @MethodName:
     * @MethodParam:
     * @Return:
     * @Description: 处理全局异常的方法
     * @Author: LinHong
     * @CreateDate: 2019/11/13 20:47
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R error(Exception e) {
        e.printStackTrace();
        return R.error().message("执行了全局异常处理方法......");

    }

    /**
     * 功能描述
     *
     * @MethodName: error
     * @MethodParam: [e]
     * @Return: com.guliedu.common.R
     * @Description: 处理特殊异常的方法
     * @Author: LinHong
     * @CreateDate: 2019/11/13 20:52
     */
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public R error(ArithmeticException e) {
        e.printStackTrace();
        return R.error().message("执行了特殊异常处理方法......");

    }
    /**
     * 功能描述
     * @MethodName: error
     * @MethodParam: [e]
     * @Return: com.guliedu.common.R
     * @Description: 自定义异常--需要手动抛出异常!!!
     * @Author: LinHong
     * @CreateDate: 2019/11/14 10:05
     */
    @ExceptionHandler(EduException.class)
    @ResponseBody
    public R error(EduException e) {
       // EduException e1 = new EduException(20001,"自定义异常测试,操作失败......";
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());

    }

}

EduException自定义异常类

继承运行时异常类,添加两个属性即可:状态码、返回信息。

/**
 * @BelongProjecet: guli-framework-parent
 * @BelongPackage: com.guliedu.eduservice.handler
 * @ClassName: EduException
 * @Description: 自定义异常
 * @Copyright: 2019-xxx-Powered by 研发四部
 * @Author: LinHong
 * @CreateDate: 2019/11/14 9:58
 * @Version: V1.0
 */
@Data
//无参构造
@NoArgsConstructor
//有参构造
@AllArgsConstructor
public class EduException extends RuntimeException{
    //状态码
    private Integer code;
    //返回信息
    private String msg;

}

(自定义异常测试)异常位置

注意:自定义异常需要手动调用,才会执行!

    /**
         *测试特殊异常 ArithmeticException
         */
        try {
            int i =666/0;
        } catch (Exception e) {
            //抛出自定义异常
            throw new EduException(20001,"自定义异常测试,执行此操作.......");
        }

R 返回结果类(附)

/**
 * @BelongProjecet: guli-framework-parent
 * @BelongPackage: com.guliedu.common
 * @ClassName: R
 * @Description: 返回结果类--链式编程
 * @Copyright: 2019-xxx-Powered by 研发四部
 * @Author: LinHong
 * @CreateDate: 2019/11/13 14:32
 * @Version: V1.0
 */
@Data
public class R {
    private boolean success;
    private Integer code;
    private String message;
    private Map<String, Object> data = new HashMap<>();
    //构造方法私有化
    private R(){}
    //对外提供可以访问方法
    public static R ok(){
        R r = new R();
        r.setSuccess(true);
        r.setCode(ResultCode.OK);
        r.setMessage("成功");
        return r;
    }

    public static R error(){
        R r = new R();
        r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        return r;
    }

    public R message(String message){
        this.setMessage(message);
        return this;
    }

    public R code(Integer code){
        this.setCode(code);
        return this;
    }

    public R data(String key, Object value){
        this.data.put(key, value);
        return this;
    }

    public R data(Map<String, Object> map){
        this.setData(map);
        return this;
    }
}

ResultCode数据状态码接口(附)

package com.guliedu.common;

/**
 * @BelongProjecet: guli-framework-parent
 * @BelongPackage: com.guliedu.common
 * @ClassName: ResultCode
 * @Description: 编写统一结果返回,创建公共模块--定义返回数据状态码
 * @Copyright: 2019-xxx-Powered by 研发四部
 * @Author: LinHong
 * @CreateDate: 2019/11/13 14:20
 * @Version: V1.0
 */
public interface ResultCode {
    //成功
    int OK = 20000;
    //失败
    int ERROR =20001;
    //用户名或密码错误
    int LOGIN_ERROR =20002;
    //权限不足
    int ACCEAA_ERRORR=20003;
    //远程调用失败
    int REMOTE_ERROR = 20004;
    //重复操作
    int REPEAT_ERROR = 20005;
}

♚学习、实战、总结、分享,让生活变得更美好!
☞林大侠CSDN博客:https://coding0110lin.blog.csdn.net/  欢迎转载,一起技术交流探讨!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI