Java:除了身份验证之外我应该抛出什么?

时间:2011-09-29 16:38:10

标签: java api exception authentication throw

我正在写一个小型库,我需要访问几种不同类型的文件。虽然访问方法本身对于每种文件格式都不同,但它们似乎有很多共同之处,我在类层次结构中放置了一个接口,我在其中编写了一个应该连接到数据源的方法。

但是,由于数据源可能受密码和/或用户权限保护,因此有时需要身份验证才能检索数据。我的问题是:

  1. 在需要身份验证时抛出异常是个好主意吗?

    由于我想尽可能少地公开实现,我只想告诉用户发生了什么。但身份验证可能需要许多不同的东西(用户名,密码等),所以我可以将它们打包成一个例外并将其抛出吗?或者,也许有更好的方式而不诉诸异常,因为“需要身份验证”并不是异常通常用来处理的异常行为。

  2. 需要身份验证时会抛出什么异常?

    现在假设我决定使用异常来处理这个问题。我应该抛出哪个例外? Java API附带的几个AuthenticationException似乎不符合此要求,因为它们似乎都是特定于案例的,例如,在命名服务中使用。我不确定SecurityException是否可行,但如果这是不合适的,我仍然真的不想抛出自己的异常,因为这会阻碍其他人理解我的代码以及后面发生的事情API。

  3. 感谢任何输入!这有点冗长或者过于冗长,因此任何可以改善这个问题的编辑都非常受欢迎。

2 个答案:

答案 0 :(得分:4)

AuthenticationException

如果需要登录,我会去发送AuthenticationException消息,如果通行证不好,我会输入用户名或密码错误。

最佳做法是不要披露登录是否存在。有时在HTTP中,通常会使用未找到的内容隐藏未经授权的访问。因此,如果凭证不允许连接,则就像连接不存在一样。

答案 1 :(得分:1)

由于它是您自己的API,您可以创建自己的Exception来使用它,它可以包含详细信息......使用“听起来最接近”您的异常的Java异常没有任何要求或好处。

我个人觉得用try / catch块加密我的代码是单调乏味的。所以我尝试制作不需要它的API。

在您的情况下,也许您可​​以提供查询,以便您的API客户可以预检这些操作,其用法可能类似于:

Thing t = new Thing(...);
if(t.needsAuth())
{
  boolean ok = t.doPassword("abc123");
  if(!ok)
    log("wrong password");
}
boolean did= t.doIt();
if(!did)
  log("sorry: " + t.getProblem());