3

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

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

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

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

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

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

感谢您的任何意见!这有点冗长或可能过于冗长,因此非常欢迎任何可以改善问题的编辑。

4

2 回答 2

6

AuthenticationException

AuthenticationException如果需要登录,并且如果通行证不好,则用户名或密码错误,我会使用该消息。

最好不要透露登录是否存在。有时在 HTTP 中,隐藏未经授权的访问是很常见的。因此,如果凭据不允许连接,则就像连接不存在一样。

于 2011-09-29T16:57:49.583 回答
1

Since it's your own API, you might create your own Exception to go with it, which can carry the details... There's no requirement or benefit to using the Java exception that "sounds closest to" your exception.

I personally find that peppering my code with try/catch blocks is... tedious and unsightly. So I try to make API's that don't require it.

In your case, maybe you could provide queries so your API clients could preflight the actions, and their usage might look something like:

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());
于 2011-09-29T16:48:51.693 回答