应为api接口层校验建独立异常类(如invalidfieldexception),继承runtimeexception,含fieldname、errorcode、message字段,controller层校验格式/必填性,service层校验业务规则,并用@controlleradvice统一处理返回友好响应。

Java 中处理用户输入校验失败,核心是用自定义异常把“错在哪”说清楚,再统一拦截转化为用户能看懂的反馈,而不是让 IllegalArgumentException 或 NullPointerException 泄露到前端。
该不该建新异常类?看校验意图
不是所有校验都值得新建异常。关键判断标准是:这个错误是否需要被单独识别、分类响应或记录?
- 如果只是内部方法参数非空检查,用 IllegalArgumentException 就够了,简洁直接
- 如果是 API 接口层收到手机号格式错误、用户名长度超限、邮箱非法等,建议建独立异常,比如 InvalidFieldException
- 异常类应继承 RuntimeException(非检查异常),避免强制调用方写 throws 或 try-catch,符合“快速失败”原则
怎么设计一个实用的校验异常类
一个好用的自定义异常至少包含字段名、错误码和提示消息,方便前端展示或日志追踪:
- 字段名(fieldName):标出哪个输入项错了,如 "email" 或 "passwordConfirm"
- 错误码(errorCode):例如 4001 表示格式错误,4002 表示重复,便于统一错误体系
- 消息(message):面向开发者的描述,如 "email format is invalid",不拼接原始输入防泄露
- 可选带构造器:支持仅传 message、message + fieldName、message + fieldName + errorCode 三种常用组合
校验点要卡在入口,别让脏数据往下流
校验位置决定问题定位效率和修复成本:
- Controller 层:校验 HTTP 请求参数格式、必填性、长度、正则(如手机号、身份证号)
- Service 方法开头:校验业务规则,如 “新密码不能与旧密码相同”、“起始时间不能晚于结束时间”
- 别等到 DAO 层才查“用户名已存在”——这时 Service 可能已完成部分状态变更,回滚麻烦
统一捕获并转成友好响应
Spring 项目中推荐用 @ControllerAdvice + @ExceptionHandler:
- 捕获 InvalidFieldException,返回 HTTP 400 状态码 + JSON 格式 { "code": 4001, "field": "email", "message": "邮箱格式不正确" }
- 避免在每个 Controller 里重复 try-catch,也别用 if-else 返回错误对象——破坏异常语义
- 日志中记录异常但脱敏,比如不打印用户提交的 email 原文,只记 "InvalidFieldException for field 'email'"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











