2011-09-29 112 views
2

我正在写一个小型库,并且需要访问几种不同类型的文件。尽管访问方法本身对于每种文件格式都是不同的,但它们似乎有很多共同之处,并且我在类层次结构中放置了一个接口,其中我编写了一个应连接到数据源的方法。Java:我应该/除了身份验证时抛出什么?

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

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

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

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

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

感谢您的任何意见!这有点冗长,也许过于冗长,所以任何可以改善问题的编辑都非常受欢迎。

+0

那你现在的API如何? 'openFile(String name,String userName,String password);'并且调用者不知道是否对于特定的文件调用应该是'openFile(name,null,null);''或'openFile(name,administrator)“1234 “);'? – Cratylus

+0

@ user384706:现在我只是重载了这些方法,并提供了一个只有文件地址的版本,一个带有密码,另一个带有用户名和密码。所有三个都会在失败时抛出异常,第一个和第二个只是调用第三个方法来实现结果。感谢评论! –

回答

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()); 
3

AuthenticationException

我会去与投掷AuthenticationException消息要么是如果登录是必要的,如果通行证不好,用户名或密码错误。

不透露是否存在登录是最佳做法。有时在HTTP中,通常隐藏未被发现的未经授权的访问。所以如果证书不允许连接它就像连接不存在一样。

+1

+1关于认证和披露的忠告!谢谢! –

相关问题