验证-抛出异常还是返回False?
时间:2020-01-09 10:35:58 来源:igfitidea点击:
验证输入数据时,如果输入无效,则不必总是引发异常。如何处理无效数据或者合理地声明状态通常取决于以下条件:
Can the code detecting the error, interact sensibly with the user, to correct the error?
如果错误是由用户的输入引起的,并且该用户能够更正输入并重试,则通常更喜欢进行交互而不是抛出异常。另外,我们可能希望在将输入中所有可能的错误显示给用户之前,先进行检测。这样,用户可以在下一次重试之前更正所有错误,而无需重复进行更正,重试,更正,重试等重复操作。例如,在servlet中,我们可以这样:
public void service(HttpServletRequest request,
HttpServletResponse response){
boolean isStreetvalid = validateStreet (request);
boolean isZipCodeValid = validateZipCode(request);
boolean isPhoneValid = validatePhone (request);
if(isStreeValid && isZipCodeValid && isPhoneValid){
//perform action
} else {
//redirect back to HTML form and show the three errors.
}
}
请注意,没有任何一种验证方法会引发异常。而是它们返回true或者false。即使输入数据无效,也无需引发异常。
相反,在DAO类中,我们很可能无法与用户进行交互以更正错误。 DAO对象甚至可能不知道是否从Web服务,Servlet或者其他地方调用了它。它无法知道输入是否来自其他系统,文件或者用户。它无法知道如何通过与用户的交互来解决错误,甚至无法解决该错误。
在这种情况下,DAO对象发出错误信号的标准方法是引发异常。可以使用其他机制,例如返回码等,但这不会改变DAO无法自行处理错误的事实。在调用DAO之前,应已验证输入数据。这是它的外观:
public void insertAddress(Address address){
validate(address);
//insert address
}
public void validate(Address address) {
if(isInvalidCity(address.getCity()){
throw new InvalidArgumentException(
"City " + address.getCity() + " is not valid");
}
// more if-statements like the one above,
// validating each field in the address object.
}
在此示例中,一旦发现验证错误,validate()方法将引发异常。 insertAddress方法无法与用户交互以更正错误。因此,抛出异常来发出错误信号是适当的。或者,可以在引发异常之前检测到所有错误。

