我是这样的写的,未必合理,仅供参考和讨论:
一、在服务端,定义两个异常类:XxxException, XxxRuntimeException (Xxx一般为项目名的简称),且处理参数错误的原则是fail-fast,有错就抛出。
1、 在处理请求的类中(业务场景),提供一个校验方法,抛出checked exception和unchecked exception
/** 验证所有的请求参数,fail-fast */
public void validate() throws XxxException {
// 调用验证某个参数的方法, 比如判断是否携带了令牌,令牌是否合法
// 将任何单个参数检验抛出的异常,比如日期格式错误,空指针异常等转化为XxxExcpetion
// 将所有内部可能出现的异常,比如连接池资源耗尽、SQL异常等,转化为XxxRuntimeException
// 具体参数校验的实现,放在单独的一个类中,可以通过继承来复用公共参数的校验和通用的校验方法。
}
2、在servlet中,捕获两种异常,并打印不同级别的日志和返回不同的响应
try {
processor.validate();
// 返回正常处理的结果
} catch(XxxException e){
// 打印警告日志,说明客户端参数出错了
// 返回400错误的提示
} catch(XxxRuntimeException e) {
// 打印错误日志,说明服务端内部出错了
// 返回500错误的提示
}
二、在应用端,比如android应用,会将参数校验放在(业务对象)中,业务对象所有的字段都是public,没有getter和setter方法。
应用端的校验之所以放在业务对象中,是因为某个具体的应用相对于服务,其参数校验的语境相对单一。
class BusinessObject {
public boolean isValid() {
}
public void persist() {
// 持久化
}
}
在调用的地方
if (bo.isValid()) {
bo.persist();
} else {
// 提示用户哪里出错了
}