用SpringCloud Alibaba搭建属于自己的微服务(十)~基础搭建~自定义异常、统一结果集和全局异常处理器

本文介绍了如何在SpringCloud Alibaba环境中构建自定义异常体系,包括客户端异常和服务端异常,并详细阐述了统一结果集的设计和实现,通过在common包中创建ResultSet类来标准化返回结果。接着,文章探讨了全局异常处理器的设置,包括其作用、实现方式以及测试,确保所有微服务能集中处理异常。最后提供了源码仓库链接供读者参考。

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

一.自定义异常体系

1.背景

在业务代码的开发中,往往会有这种情况,代码逻辑走到某一步,通过if的判断发现程序的逻辑无法继续往下面走了,否则会有一定的问题,这时候我们需要抛出异常组织程序往下进行,快速响应这个请求,并且回滚事物,这就是我们的自定义异常体系.

2.设计

如何设计自定义异常体系,需要我们对自身系统的业务有一定的了解,例如一个商城,可能会有以下的自定义异常.

异常 场景
OrderException.class 订单业务发生异常
PayException.class 支付业务发生异常
GoodsException.class 商品业务发生异常

我们这里不做如何详细的异常体系设计,暂时只区分客户端异常,服务端异常.
(1)代码
CcmMallException.java

package com.ccm.common.exception;

/**
 *  @Description 自定义异常超类
 *  @Author ccm
 *  @CreateTime 2020/07/10 14:35
 */
public class CcmMallException extends RuntimeException {
   
   
}

CustomerException .java

package com.ccm.common.exception;

import lombok.Getter;

/**
 * @Description 客户端异常
 * @Author ccm
 * @CreateTime 2020/7/10 14:40
 */
@Getter
public class CustomerException extends CcmMallException {
   
   

    private CodeEnum codeEnum;  //状态码
    private String errorMessage;  //错误详细信息

    public CustomerException(String errorMessage) {
   
   
       this.codeEnum = CodeEnum.ILLEGAL_REQUEST;
       this.errorMessage = errorMessage;
    }

    public CustomerException(CodeEnum codeEnum, String errorMessage) {
   
   
        this.codeEnum = codeEnum;
        this.errorMessage = errorMessage;
    }
}

ServerException.java

package com.ccm.common.exception;


import lombok.Getter;

/**
 *  @Description 服务端异常
 *  @Author ccm
 *  @CreateTime 2020/07/10 14:43
 */
@Getter
public class ServerException extends CcmMallException {
   
   
    private CodeEnum codeEnum;  //状态码
    private String errorMessage;  //错误详细信息

    public ServerException(String errorMessage) {
   
   
        this.codeEnum = CodeEnum.SYSTEM_INNER_ERROR;
        this.errorMessage = errorMessage;
    }

    public ServerException(CodeEnum codeEnum, String errorMessage) {
   
   
        this.codeEnum = codeEnum;
        this.errorMessage = errorMessage;
    }
}

二.统一结果集

1.common包里加入Reultset类,提供构造统一结果集的静态方法

package com.ccm.common.exception.result;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;

/**
 * @Description 统一结果集
 * @Author ccm
 * @CreateTime 2020/7/14 17:36
 */
@Slf4j
@Getter
@ToString
public class ResultSet<T> {
   
   
    private Integer code; //状态码

    private String codeMessage; //状态码信息

    @Setter
    private String errorMessage;   //前后端对接错误信息

    @Setter
    private String errorMessageToUser; //给用户看的错误信息

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss:SSS",timezone = "GMT+8")   //jackson指定时间转换格式
    @JSONField(format="yyyy-MM-dd HH:mm:ss:SSS")    //fastjson指定时间转换格式
    private Date timestamp = new Date();

    @Setter
    private T data; //响应数据

    //私有构造器
    private ResultSet() {
   
   }

    //响应成功,无响应数据
    public static ResultSet success() {
   
   
        ResultSet resultSet = new ResultSet();
        resultSet.code = CodeEnum.SUCCESS.getCode();
        resultSet.codeMessage = CodeEnum.SUCCESS.getCodeMessage();
        return resultSet;
    }

    //响应成功,有响应数据
    public static <T> ResultSet<T> success(T data) {
   
   
        ResultSet resultSet = new ResultSet();
        resultSet.code = CodeEnum.SUCCESS.getCode()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值