Трудно найти консенсус, хотя многие люди говорят, что вы не должны использовать исключения для обработки некорректного пользовательского ввода . Тем не менее, я не уверен, что это плохо в моем конкретном случае. Не могли бы вы попытаться объяснить, почему я не прав?
Ниже приведен мой код (пожалуйста, обратите внимание только на аспект обработки исключений). Мое рациональное использование исключений здесь заключается в том, что если бы я этого не сделал, предполагая, что я бы хотел сохранить логику проверки близкой к парсингу ключевого слова (поскольку анализ и проверка тесно связаны), мне пришлось бы изменить три метода (submitOnAdd, submitOnUpdate, getKeywords), чтобы заставить их справиться с этой исключительной ситуацией. Как вы думаете, я определенно неправильно в этом случае использовал исключения, или это вопрос личного стиля?
public SubmitResponse internalSubmit(Map<String, String[]> submitParameters) {
try {
if (!submitParameters.containsKey("foo")) {
return submitOnAdd(submitParameters);
} else {
return submitOnModify(submitParameters);
}
} catch (SubmitErrorException e) {
return SubmitResponse.fieldError(Arrays.asList(e.getSubmitError()));
}
}
SubmitResponse submitOnAdd(Map<String, String[]> submitParamters) {
// do some stuff
// ...
if (addKeywordList(createKeywordList(submitParameters.get("concatenated_keywords"))
return SubmitResponse.OK();
return SubmitResponse.bad("Failed to add");
}
SubmitResponse submitOnUpdate(Map<String, String[]> submitParamters) {
// do some other stuff
// ...
if (updateKeywordList(createKeywordList(submitParameters.get("concatenated_keywords"))
return SubmitResponse.OK();
return SubmitResponse.bad("Failed to update");
}
List<Keyword> getKeywords(String concatenatedKeywords) {
List<String> rawKeywords = splitKeywords(concatenatedKeywords);
return Collections.transform(new Function<String, Keyword>() {
@Override
public KeywordListProto.Keyword apply(String expression) {
return buildKeyword(expression);
}
});
}
private Keyword buildKeyword(String rawKeyword) {
// parse the raw keyword
if (/*parsing failed */)
throw new SubmitResponseException("Failed to parse keyword " + rawKeyword);
return parsedKeyword;
}