2011-07-17 83 views
0

我正在验证实用程序方法中Restlet URL的某些输入(这样,如果我采取的行为发生变化,我只能将其更改为一个地方,yay)。 legalName本质上验证该值为alphaNumeric,但我可能会很快允许其他角色。哪个例外最适合在这里?

我尽量让我的例外有意义 - 在这种情况下什么异常会是最好的?

public static String getProperty(Request request, String key) { 
    String value = request.getAttributes().get(key).toString(); 
    // unless something is specifically text, it is a property 
    if(legalName(value)) return value; 
    throw new IllegalArgumentException(value); 

} 

我的想法是:

  • 抛出:IllegalArgumentException - 的关键,直接导致了无效的结果
  • IllegalStateException异常 - 我们正在尝试使用不符合要求的值
  • 也不例外 - 回报一个空字符串并记录违规行为发生的事实
  • 没有例外 - 删除任何不需要的字符,返回消毒后的字符串并记录事实

当然我不是第一人,要验证:-)

回答

2

当属性存储时,应该抛出像这样的异常,而不是检索。检查Restlet validation

如果你更喜欢坚持自己的解决方案:

  • 的方法重命名为validateName(..),让它抛出异常。如果没有 - 返回值。
  • javax.validation.ValidationException看起来更好的选择,但你可以使用你提到的两个IllegalXException中的任何一个。只要确保他们有更详细的信息。
+0

通常情况下,它不会被存储,它只是用作参数。它可能仍然会以查询结束。我的想法是,如果我一进入系统就对其进行清理,我知道我会有安全的投入。 – corsiKa

+0

看到我的更新btw – Bozho

+0

哦,我很喜欢第一个子弹选项。这也更好,因为使用验证的其他任何事情都不必执行抛出,也就是说,如果它发生更改(如下所述并使用验证框架),它就在我更改它的地方,而不是一打。至于存储验证,我明白你的意思。在它甚至到达我的代码之前基本上拦截它。我肯定会研究这一点。谢谢! – corsiKa

1

这似乎是无效的用户输入,所以首先我会去一个ValidationException某种并使用之前输入验证框架,而不是自己管理它。如果不是ValidationException,那么IllegalArgumentException可能会使您列出的选择最有意义。

+0

验证框架?我想我没有完全意识到他们,但我想有一个框架的一切。你能推荐一个非常轻量级的验证框架吗? – corsiKa

+1

Spring的数据绑定和验证框架非常好。您不必使用Spring的其余部分从中受益。 – duffymo

+0

谢谢duffy,我会研究一下。 – corsiKa

0

您可以使用自定义(您自己)的异常类。根据情况或验证,您可以使用适当的消息将其抛出。 For Ex:1.For非法参数异常情况在try catch和catch中处理该代码块并抛出自己的异常并带有适当的消息。

+0

我可以制作自己的Exception类,但我更喜欢在做标准事情时使用标准类。 (Effective Java 2nd ed Item 60:赞成使用标准异常。)我还没有添加消息,尽管无论我最终使用它的异常都会有适当的消息:-) – corsiKa