Skip to content

全局异常

字数
521 字
阅读
3 分钟

捕获和处理应用中的所有异常,减少重复代码,保证接口返回一致性,提高系统可维护性

注解

@GoEnableException

状态码

错误码类型说明位置
1000RUNTIME运行错误GlobalExceptionAdvice → runtimeException
1010ASYNC执行错误GlobalExceptionAdvice → runtimeException
2000REQUEST请求失败GlobalExceptionAdvice → requestException
2010RETRY重试失败HttpRetryer
2020LIMITER请求限流LimiterAspect
3000VALIDATOR校验错误GlobalExceptionAdvice → validatorException
4000DBASE数据错误GlobalExceptionAdvice → jdbcException
5000TOKEN令牌错误TokenInterceptor
6000SIGN签名错误SignerAspect
9999UNKNOWN未知-

示例

运行时

手动抛空指针异常时

java
@GetMapping("runtime")
public void runtime() {
  throw new NullPointerException("手动抛空指针异常");
}
json
{
  "code": 1000,
  "msg": "手动抛空指针异常",
  "status": false
}

请求时

GET 方式请求 POST 方法,请求方式不匹配时

java
@PostMapping("request")
public void request() {
  log.info("非post请求,抛 {} 异常", HttpRequestMethodNotSupportedException.class);
}
json
{
  "code": 2000,
  "msg": "Request method 'GET' is not supported",
  "status": false
}

效验时

传递参数为空时,分HibernateSpring 为 2 种情况

  • Hibernate Validator
java
@GetMapping("hibernate/validator")
public void hibernate_validator(@NotBlank String p) {
  log.info("参数空,抛 {} 异常", ConstraintViolationException.class);
}
json
{
  "code": 3000,
  "data": ["hibernate_validator.p 不能为空"],
  "msg": "Validation Error",
  "status": false
}
  • Spring Validator
java
@Data
public class BaseVo {
    @NotBlank
    private String key;
}

@GetMapping("spring/validator")
public void spring_validator(@Validated BaseVo vo) {
  log.info("参数空,抛 {} 异常", BindException.class);
}
json
{
  "code": 3000,
  "data": ["key 不能为空"],
  "msg": "Validation Error",
  "status": false
}

数据库

查询无表

java
@GetMapping("database")
public void database() {
    log.debug("无此表,抛 {} 异常", SQLSyntaxErrorException.class);
    // 不捕获
    JdbcTemplatePlus.queryForMap("select * from xx_test");
    // 捕获
    JdbcTemplatePlus.get().queryForMap("select * from xx_test", Maps.newConcurrentMap());
}
json
{
  "code": 4000,
  "msg": "PreparedStatementCallback; bad SQL grammar [select * from xx_test]",
  "status": false
}

自定义

java
@GetMapping("custom")
public void custom() {
    throw new RunException(RunExc.SIGN);
}
json
{
  "code": 6000,
  "msg": "Signature Error",
  "status": false
}

注意

  • 某些异常会暴露出包名、类名、方法名,请根据实际场景单独处理
java
@PostMapping("save")
public User save(BaseVo base, Member req, Model model) {
    try {
       // ....
       return user;
    } catch (Exception e) {
       throw new RunException(RunExc.RUNTIME, "保存异常");
    }
}
json
{ "code": 1000, "msg": "保存异常", "success": false }

Released under the MIT License.