Skip to content

异常处理

概述

在前后端分离的微服务项目中,统一异常处理可以避免代码中出现大量的try {...} catch {...} finally {...}代码块,减少冗余代码,增加代码可读性;统一的返回格式不仅使接口更加美观,而且便于前端统一处理很多东西,避免很多问题的产生。目前,盘古开发平台统一异常与返回值组件支持以下功能:

  • 全局异常处理
  • 异常枚举接口BaseErrorCode和异常基类BaseException
  • 全局标准返回值,支持包、类、方法层级的过滤
  • feign标准返回值处理
  • RestTemplate标准返回值处理

添加依赖

xml
<parent>
	<groupId>com.hisense.pangea</groupId>
	<artifactId>pangea-common-exception</artifactId>
	<!--该处使用当前最新版本号-->
	<version>${pangea.version}</version>
</parent>

异常处理

模块中包含了一些基本的异常处理方式(即不需要做任何代码编写已经具有基本异常处理),以及一些常见的异常code,用户只需要关心业务异常处理,直接通过 throw new 异常 的方式抛出即可

异常类和异常处理方法

  • 异常基类——BaseException
  • 异常枚举接口——BaseErrorCode
  • 异常处理方法——BaseController.throwx()

快速上手

程序主动抛出异常

jsx
throw new BaseException(AuthErrorCode.AUTHDEL_ERROR);
// 或者
throw new BaseException("403", "对不起,您的账号:" + username + " 已被删除");

//继承BaseController的Controller可自动调用异常方法
BaseController.throwx();
//或者
BaseController.throwx("403", "对不起,您的账号:" + username + " 已被删除");

通常不建议直接抛出通用的BaseException异常,应当在对应模块里添加对应领域的异常处理类以及对应的枚举错误类型。

如用户模块: 创建UserException异常类、UserErrorCode枚举。

UserException:

java
@Getter
public class UserException extends BaseException {

  private String code;

  /**
   * 使用枚举传参
   *
   * @param errorCode 异常枚举
   */
  public UserException(UserErrorCode errorCode) {
    super(errorCode.getCode(), errorCode.getMessage());
    this.code = errorCode.getCode();
  }

}

UserErrorCode

java
@Getter
public enum UserErrorCode implements BaseErrorCode {
    /**
     * 权限异常
     */
    NOT_PERMISSIONS("CLOUD401","您没有操作权限"),
    ;

    private String code;

    private String message;

    UserErrorCode(String code, String message) {
        this.code = code;
        this.message = message;
    }
}

业务中使用:

java
throw new UserException(UserErrorCode.NOT_PERMISSIONS);

上述方式抛出异常后会被模块处理,前台返回如下:

json
{
    "code": "403",
    "msg": "业务异常",
    "ts": "1602657492753"
}

在Controller的接口中抛出异常

如用户模块: 创建UserController接口类

java
@RestController
@RequestMapping("/user")
public class UserController extends BaseController {
    
    @DeleteMapping("delete")
    public String delete(@RequestBody List<Long> ids) {
        if(ids.size()==0) {
            //方式一
            throwx();
            
            //方式二
            throwx(UserErrorCode.getCode(),UserErrorCode.getMessage());
        }
        return demoService.removeByIds(ids)?"":"操作失败";
    }
    
}

上述方式一抛出异常后会被模块处理,前台返回如下:

json
{
    "code": "RES800",
    "msg": "业务异常",
    "ts": "1602657492753"
}

上述方式二抛出异常后会被模块处理,前台返回如下:

json
{
    "code": "403",
    "msg": "业务异常",
    "ts": "1602657492753"
}

系统异常枚举类 SystemErrorCode
业务通用异常枚举类 CommonErrorCode
认证鉴权异常 AuthErrorCode

参考文档