统一异常处理机制:

本文介绍了一种基于SpringMVC的统一异常处理机制,通过自定义异常类LyException和全局异常处理类BasicExceptionAdvice,实现对运行时异常和自定义异常的统一捕获与处理,返回包含状态码、异常信息及时间戳的ExceptionResult对象。

统一异常处理机制:

1、使用SpringMVC提供的统一异常拦截器(BasicExceptionAdvice)
package cn.leyou.common.exception;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * @Author: swq
 * @Date: 2019/8/28  16:00
 * 统一异常处理
 */
@ControllerAdvice
public class BasicExceptionAdvice {

    //创建处理运行时异常信息的方法
    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<String> handleException(RuntimeException e) {
        return ResponseEntity.status(500).body(e.getMessage());
    }

    //创建处理LyException异常信息的方法 
    
    @ExceptionHandler(LyException.class)
    public ResponseEntity<ExceptionResult> handleLyException(LyException e) {
        return ResponseEntity.status(e.getStatus()).body(new ExceptionResult(e.getStatus(),e.getMessage()));
    }
}

  • @ControllerAdvice:默认情况下,会拦截所有加了@Controller的类

    [外链图片转存失败(img-Kb6LBiQh-1566990546385)(F:/%E9%BB%91%E9%A9%AC102/JY/%E9%A1%B9%E7%9B%AE%E4%BA%8C/day01/%E7%AC%94%E8%AE%B0/assets/1534203615380.png)]

  • @ExceptionHandler(RuntimeException.class):作用在方法上,声明要处理的异常类型,可以有多个,这里指定的是RuntimeException。被声明的方法可以看做是一个SpringMVC的Handler

    • 参数是要处理的异常,类型必须要匹配
    • 返回结果可以是ModelAndViewResponseEntity等,基本与handler类似
2、自定义异常(LyExceptionEnums)
package cn.leyou.common.exception;

import cn.leyou.common.enums.LyExceptionEnums;
import lombok.Data;

/**
 * @Author: swq
 * @Date: 2019/8/28  16:22
 */
@Data
public class LyException extends RuntimeException {
    //定义状态码
    private Integer status;

    public LyException(LyExceptionEnums enums) {
        super(enums.getMessage());
        this.status = enums.getStatus();
    }

    public LyException(LyExceptionEnums enums, Throwable cause) {
        super(enums.getMessage(), cause);
        this.status = enums.getStatus();
    }
}

3、controller层
package cn.leyou.controller;

import cn.leyou.common.enums.LyExceptionEnums;
import cn.leyou.common.exception.LyException;
import cn.leyou.pojo.Item;
import cn.leyou.service.ItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: swq
 * @Date: 2019/8/27  19:22
 */
@RestController
public class ItemServiceController {
    @Autowired
    private ItemService itemService;

    @RequestMapping("/test")
    public ResponseEntity<Item> saveItem(Item item) {
        if (item.getPrice() == null) {
//            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
            throw new LyException(LyExceptionEnums.PRICE_CANNOT_BE_NULL);
        }
        return ResponseEntity.ok(itemService.saveItem(item));
    }
}

4、异常返回结果(ExceptionResult)( 以状态码 异常信息 时间戳的方式返回)
package cn.leyou.common.exception;

import lombok.Data;
import org.joda.time.DateTime;

/**
 * @Author: swq
 * @Date: 2019/8/28  17:36
 */
@Data
public class ExceptionResult {
    private Integer status;
    private String message;
    private String timestamp;

    public ExceptionResult(Integer status, String message) {
        this.status = status;
        this.message = message;
        this.timestamp = DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
    }
}

5、定义枚举信息(LyExceptionEnums)(目的统一异常信息显示)
package cn.leyou.common.enums;

import lombok.Getter;

/**
 * @Author: swq
 * @Date: 2019/8/28  16:19
 */
@Getter
public enum LyExceptionEnums {
    PRICE_CANNOT_BE_NULL(400, "价格不能为空!"),
    INVALID_FILE_TYPE(400, "无效的文件类型!"),
    INVALID_PARAM_ERROR(400, "无效的请求参数!"),
    INVALID_PHONE_NUMBER(400, "无效的手机号码"),
    INVALID_VERIFY_CODE(400, "验证码错误!"),
    INVALID_USERNAME_PASSWORD(400, "无效的用户名和密码!"),
    INVALID_SERVER_ID_SECRET(400, "无效的服务id和密钥!"),
    INVALID_NOTIFY_PARAM(400, "回调参数有误!"),
    INVALID_NOTIFY_SIGN(400, "回调签名有误!"),

    CATEGORY_NOT_FOUND(404, "商品分类不存在!"),
    BRAND_NOT_FOUND(404, "品牌不存在!"),
    SPEC_NOT_FOUND(404, "规格不存在!"),
    GOODS_NOT_FOUND(404, "商品不存在!"),
    CARTS_NOT_FOUND(404, "购物车不存在!"),
    APPLICATION_NOT_FOUND(404, "应用不存在!"),
    ORDER_NOT_FOUND(404, "订单不存在!"),
    ORDER_DETAIL_NOT_FOUND(404, "订单数据不存在!"),

    DATA_TRANSFER_ERROR(500, "数据转换异常!"),
    INSERT_OPERATION_FAIL(500, "新增操作失败!"),
    UPDATE_OPERATION_FAIL(500, "更新操作失败!"),
    DELETE_OPERATION_FAIL(500, "删除操作失败!"),
    FILE_UPLOAD_ERROR(500, "文件上传失败!"),
    DIRECTORY_WRITER_ERROR(500, "目录写入失败!"),
    FILE_WRITER_ERROR(500, "文件写入失败!"),
    SEND_MESSAGE_ERROR(500, "短信发送失败!"),
    INVALID_ORDER_STATUS(500, "订单状态不正确!"),

    UNAUTHORIZED(401, "登录失效或未登录!");
    private int status;
    private String message;

    LyExceptionEnums(int status, String message) {
        this.status = status;
        this.message = message;
    }
}

总结:在controller层处理异常信息,把异常信息抛给自定义异常类,经过BasicExceptionAdvice拦截,经过处理后返回包含时间戳、状态码、异常信息的异常返回结果(ExceptionResult)对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端技术那点事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值