在Java中如何抛出自定义异常实现业务校验_自定义异常处理指南

自定义异常通过继承Exception或RuntimeException实现,能精准表达业务规则违反情况;2. 在业务逻辑如转账校验中,若金额为空或小于等于零,抛出含错误码和消息的BusinessException,提升可读性与维护性。

在Java开发中,抛出自定义异常是实现业务校验的重要手段。它能让程序更清晰地表达业务规则的违反情况,提升代码可读性和维护性。直接使用系统异常(如IllegalArgumentException)虽然可行,但无法准确描述具体业务问题。通过自定义异常,可以精准反馈错误类型和信息,便于前端处理或日志追踪。

定义自定义异常类

自定义异常通常继承ExceptionRuntimeException。若希望调用方强制处理,继承Exception;若为运行时异常,继承RuntimeException

// 业务异常示例:用户不存在

public class BusinessException extends RuntimeException {
    private String code;

    public BusinessException(String message) {
        super(message);
    }

    public BusinessException(String code, String message) {
        super(message);
        this.code = code;
    }

    // getter方法
    public String getCode() {
        return code;
    }
}

在业务逻辑中抛出异常

在校验用户输入或业务规则时,一旦发现不满足条件,立即抛出对应异常。

public void transferMoney(String fromUser, String toUser, BigDecimal amount) {
    if (amount == null || amount.compareTo(BigDecimal.ZERO)
        

throw new BusinessException("INVALID_AMOUNT", "转账金额必须大于0");
    }

    if (!userExists(fromUser)) {
        throw new BusinessException("USER_NOT_FOUND", "用户不存在:" + fromUser);
    }

    // 其他逻辑...
}

统一异常处理(推荐搭配Spring使用)

在Web项目中,可通过@ControllerAdvice捕获自定义异常,返回结构化错误响应。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseBody
    @ExceptionHandler(BusinessException.class)
    public Map handleBusinessException(BusinessException e) {
        Map result = new HashMap();
        result.put("success", false);
        result.put("code", e.getCode());
        result.put("message", e.getMessage());
        return result;
    }
}

这样前端收到的响应始终是统一格式,便于解析处理。

最佳实践建议

使用自定义异常时注意以下几点:

  • 异常类名应体现业务含义,如UserNotFoundExceptionOrderStatusException
  • 提供错误码(code)便于国际化或多语言处理
  • 避免暴露敏感信息在异常消息中
  • 结合日志记录,确保异常可追溯
  • 不要用异常控制正常流程,仅用于“异常”场景

基本上就这些。合理使用自定义异常,能让业务校验更清晰,系统更健壮。