说服我使用例外进行用户验证我错了

时间:2011-05-25 14:56:57

标签: java exception

虽然many people say you should not use exceptions to handle bad user input,但很难找到共识。尽管如此,我还是不相信在我的具体案例中做坏事。你能试着解释我为什么错吗?

我的代码(请关注异常处理方面)如下。我在这里使用异常的理由是,如果我没有,假设我想让验证逻辑接近关键字解析(因为解析和验证是紧密耦合的),我将不得不改变三种方法(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 个答案:

答案 0 :(得分:1)

我不能说我永远不会建议在输入验证中使用Exceptions。但在这种情况下,我会说它增加了很多混乱。我要么:

  • 添加单独的方法来处理验证。 (可能必须在几个地方调用此方法,这是负面的,但它可能使代码更容易理解)。
  • 在更理想的情况下,我会更接近用户输入验证,不允许提交无效数据。 (可能的不利是验证和解析逻辑的分离,但如果你能以某种方式使用相同的类来做到这两点,那么可以避免这种情况。)