推荐自定义WeakPasswordException而非RuntimeException,因其能精准捕获密码策略违规、提升可读性、避免异常混用、便于日志监控;需继承RuntimeException并提供多构造器,于服务层校验失败时立即抛出,再由全局处理器统一返回结构化错误响应。

Java中密码强度不合规时,推荐自定义抛出 WeakPasswordException,这是一种典型的业务校验异常,用于明确区分“密码不符合策略”与系统级错误(如数据库连接失败)。
为什么用 WeakPasswordException 而不是 RuntimeException?
使用自定义异常能提升代码可读性和异常处理的精准性:
- 调用方可通过
catch (WeakPasswordException e)单独捕获并返回友好的用户提示(如“密码至少8位,需含大小写字母和数字”) - 避免和
IllegalArgumentException等泛型异常混用,降低误判风险 - 便于统一日志记录或监控(例如对所有 WeakPasswordException 做告警降级)
如何定义 WeakPasswordException?
继承 RuntimeException 即可,无需强制捕获,符合校验类异常的设计惯例:
public class WeakPasswordException extends RuntimeException {
public WeakPasswordException() {
super("密码强度不符合要求");
}
public WeakPasswordException(String message) {
super(message);
}
}
建议提供带错误码的构造器(如 WeakPasswordException(1001, "缺少特殊字符")),方便前端映射具体提示。
立即学习“Java免费学习笔记(深入)”;
在密码校验逻辑中何时抛出?
应在业务服务层(如 UserServiceImpl)验证密码后立即抛出,不要等到持久化阶段:
- 检查长度(如 ≥8)、大小写字母、数字、特殊字符是否都存在
- 拒绝常见弱口令(如 "123456"、"password"、连续/重复字符)
- 若任一规则不满足,直接
throw new WeakPasswordException("密码必须包含至少1个大写字母");
Controller 层怎么处理?
配合全局异常处理器,统一返回标准错误响应:
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(WeakPasswordException.class)
public Result<?> handleWeakPassword(WeakPasswordException e) {
return Result.fail(400, e.getMessage());
}
}
这样前端收到的是结构化 JSON(如 {"code":400,"msg":"密码必须包含至少1个大写字母"}),而非 500 错误页。



















