Убедите меня, что я ошибаюсь в использовании исключений для проверки пользователя - PullRequest
3 голосов
/ 25 мая 2011

Трудно найти консенсус, хотя многие люди говорят, что вы не должны использовать исключения для обработки некорректного пользовательского ввода . Тем не менее, я не уверен, что это плохо в моем конкретном случае. Не могли бы вы попытаться объяснить, почему я не прав?

Ниже приведен мой код (пожалуйста, обратите внимание только на аспект обработки исключений). Мое рациональное использование исключений здесь заключается в том, что если бы я этого не сделал, предполагая, что я бы хотел сохранить логику проверки близкой к парсингу ключевого слова (поскольку анализ и проверка тесно связаны), мне пришлось бы изменить три метода (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;
}

1 Ответ

1 голос
/ 25 мая 2011

Не могу сказать, что никогда не советовал бы использовать исключения где-либо при проверке входных данных. Но в этом случае, я бы сказал, это добавляет много путаницы. Я бы либо:

  • Добавить отдельный метод для обработки проверки. (Возможно, придется вызывать этот метод в нескольких местах, что отрицательно, но это может облегчить понимание кода).
  • В более идеальном случае я бы проверил ближе к пользовательскому вводу и не позволил бы представить неверные данные. (Возможный минус - это разделение логики проверки и синтаксического анализа, но если бы вы могли как-то использовать один и тот же класс для выполнения обоих, этого можно было бы избежать).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...