Spring Boot学习——统一异常处理

本文介绍了一种通过自定义异常处理来实现年龄判断的方法。利用Java编写,文章详细讲解了如何创建异常类、异常处理类及相关的服务和控制器。通过这些组件,能够有效地判断女孩的年龄,并根据不同年龄段返回相应的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章出自视频:https://www.imooc.com/learn/810

跟着廖师兄的视频学习的哈,例子有点儿那个啥,内容还是不错的,我也就不换了。学完后记点儿笔记,方便以后忘记了过来查看。

功能: 获取某女生的年龄并判断,小于10,返回“应该在上小学”;大于10且小于16,返回“可能在上初中”,并且还有对应的code值。

步骤: 

    1.新建一个Result对象。确定好返回前端的格式。

  Result.java:

package com.haiyu.demo.domain;

import static javafx.scene.input.KeyCode.T;

public class Result<T> {
    private Integer code;

    private String msg;

    private T data;

    public Integer getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

   2.放代码之前有个知识点需要记录一下:一般前后端的开发是分开的,所以后端传递给前端的数据需要有个固定的格式,无论是传递异常数据还是正常数据。

文中为了解决逻辑在一个地方处理,引入了异常处理办法,由于默认的Exception只接收msg一个字段,所以我们自己定义了一个GirlException,因为我们不仅需要返回msg ,还需要返回code。自己定义了异常,我们还需要捕获这个异常,所以定义了ExceptionHandle类来捕获,过程如下:

GirlException.java:该类需要继承RuntimeException ,RuntimeException 继承Exception ,Spring框架只对抛出的异常是RuntimeException 进行事物回滚。

package com.haiyu.demo.exception;

import com.haiyu.demo.enums.ResultEnum;

public class GirlException extends RuntimeException {
    private Integer code;

    public GirlException(ResultEnum resultEnum) {
        super(resultEnum.getMsg());
        this.code = resultEnum.getCode();
        System.out.println("code:"+code+"message:"+resultEnum.getMsg());
    }

    public Integer getCode() {
        return code;
    }

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

新建一个异常捕获类ExceptionHandle.java:

package com.haiyu.demo.handle;

import com.haiyu.demo.domain.Result;
import com.haiyu.demo.exception.GirlException;
import com.haiyu.demo.utils.ResultUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class ExceptionHandle {

    @ExceptionHandler(value = Exception.class)//此处声明需要捕获Exception类
    @ResponseBody
    public Result handle(Exception e){
        if (e instanceof GirlException){//判断异常是否为自己定义的GirlException
            GirlException girlException=(GirlException) e;
            System.out.println(girlException.getCode()+girlException.getMessage());
            return ResultUtil.failure(girlException.getCode(),girlException.getMessage());
        }else{
            return ResultUtil.failure(-1,"未知错误");
        }
    }
}
package com.haiyu.demo.utils;

import com.haiyu.demo.domain.Result;

public class ResultUtil {
    public static Result success(Object object){
        Result result=new Result();
        result.setCode(0);
        result.setMsg("success");
        result.setData(object);
        return result;
    }

    public static Result failure(Integer code,String msg){
        Result result=new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
}

3.在controller和service里面编写方法:

GirlController.java: 只放了相关的方法

    @GetMapping(value = "/girls/getAge/{id}")
    public void getAge(@PathVariable("id") Integer id) throws Exception{
        girlService.getAge(id);
    }

GirlService.java:

 package com.haiyu.demo.service;

import com.haiyu.demo.domain.Girl;
import com.haiyu.demo.enums.ResultEnum;
import com.haiyu.demo.exception.GirlException;
import com.haiyu.demo.repository.GirlRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

@Service
public class GirlService {

    @Autowired
    private GirlRepository girlRepository;

    @Transactional   //这里是个事物管理的注解,例如B如果导入数据库失败,A也会回滚操作,保持跟B 一样的状态
    public void insertTwo(){
        Girl girlA=new Girl ();
        girlA.setAge(18);
        girlA.setCupSize("A");
        girlRepository.save(girlA);

        Girl girlB=new Girl ();
        girlB.setAge(19);
        girlB.setCupSize("B");
        girlRepository.save(girlB);
    }

    public void getAge(Integer id) throws Exception {
        Girl girl=girlRepository.findById(id).get();
        Integer age=girl.getAge();
        System.out.println(age);
        if(age<10){
            throw new GirlException(ResultEnum.PRIMARY_SCHOOL);//为了方便管理错误提示,建议采用枚举,枚举代码如下。为了传递给前端的格式固定,所以可以自己定义异常
        }else if (age >10 &&age<16){
            throw new GirlException(ResultEnum.MIDDLE_SCHOOL);
        }
    }

    public Girl findOne(Integer id){
        return girlRepository.findById(id).get();
    }
}
package com.haiyu.demo.enums;

public enum ResultEnum {//方便统一管理code 和 msg
    UNKONW_ERROR(-1,"未知错误"),
    SUCCESS(0,"成功"),
    PRIMARY_SCHOOL(100,"你可能在上小学"),
    MIDDLE_SCHOOL(101,"你可能在上初中")
    ;
    private Integer code;
    private String msg;

    ResultEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}
转载请注明出处,谢谢: https://blog.youkuaiyun.com/blue___ocean/article/details/80393812

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值