Java:当身份验证被排除在外时,我应该/应该抛出什么?

Java:当身份验证被排除在外时,我应该/应该抛出什么?,java,api,exception,authentication,throw,Java,Api,Exception,Authentication,Throw,我正在编写一个小型库,在其中我需要访问几种不同类型的文件。虽然每种文件格式的访问方法本身不同,但它们似乎有很多共同点,我在类层次结构中放置了一个接口,在该接口中我编写了一个应该连接到数据源的方法 但是,由于数据源可能受到密码和/或用户权限的保护,因此有时需要身份验证来检索数据。我的问题是: 在需要身份验证时抛出异常是个好主意吗 因为我希望尽可能少地公开实现,所以我只想告诉用户发生了什么。但是身份验证可能需要很多不同的东西(用户名、密码等),所以我可以将它们打包到一个异常中并将其抛出吗?或者,可能

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

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

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

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

  • 需要身份验证时要抛出什么异常

    现在假设我决定使用异常来处理这个问题。我应该抛出哪个异常?Java API附带的几个
    AuthenticationException
    s似乎不符合此要求,因为它们似乎都非常区分大小写,例如在命名服务中使用。我不确定是否应该使用
    SecurityException
    ,但如果这样做不合适,我仍然不想抛出我自己的异常,因为这会妨碍其他人理解我的代码以及API背后的内容


  • 谢谢你的意见!这有点冗长,或者可能太冗长,因此任何可以改进问题的编辑都是非常受欢迎的。

    因为这是您自己的API,您可以创建自己的异常来处理它,它可以包含详细信息。。。使用“听起来最接近”您的异常的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());
    
    AuthenticationException
    如果需要登录,我会抛出消息;如果密码不好,我会抛出错误的用户名或密码


    最好不要透露登录是否存在。有时在HTTP中,通常会使用未找到的文件隐藏未经授权的访问。因此,如果凭据不允许连接,就好像连接不存在一样。

    那么您的API现在怎么样了?您是否有类似于openFile(字符串名称、字符串用户名、字符串密码)的东西调用方不知道对于特定文件,调用是否应该是
    openFile(name,null,null)
    openFile(名称,管理员,“1234”)
    ?@user384706:现在我只是重载了这些方法,并提供了一个版本,其中一个版本只包含文件地址,一个版本包含密码,另一个版本包含用户名和密码。这三个方法都会在失败时抛出异常,第一个和第二个方法只需调用第三个方法即可获得结果。谢谢你的评论+1有关认证和披露的sage建议!谢谢