Java: Должен ли я / что бросить, когда аутентификация исключена? - PullRequest
2 голосов
/ 29 сентября 2011

Я пишу небольшую библиотеку, в которой мне нужно получить доступ к нескольким разным типам файлов.Хотя сам метод доступа различен для каждого типа файлов, похоже, у них много общего, и я поместил интерфейс в иерархию классов, в которой я написал метод, который должен подключаться к источнику данных.

Однако, поскольку источник данных может быть защищен паролем и / или разрешением пользователя, иногда ему требуется аутентификация для извлечения данных.Мои вопросы:

  1. Это хорошая идея, чтобы генерировать исключение, когда требуется аутентификация?

    Поскольку я хочу раскрыть реализацию как можно меньше, я толькохочу рассказать пользователю, что случилось.Но для аутентификации может потребоваться много разных вещей (имя пользователя, пароль и т. Д.), Поэтому могу ли я упаковать их в одно исключение и выбросить ?Или, может быть, есть лучший способ, не прибегая к исключениям , поскольку «Требуется аутентификация» на самом деле не исключительное поведение, которое обычно используется для обработки исключения.

  2. Чтоисключение, чтобы бросить, когда требуется аутентификация?

    Теперь предположим, что я решил использовать исключение для обработки этого.Какое исключение я должен выбросить?Несколько AuthenticationException, поставляемых с Java API, похоже, не соответствуют этому требованию, поскольку все они, похоже, очень специфичны для конкретного случая, например, используются в службе именования.Я не уверен, если SecurityException - это путь, но если это неправильно, я все еще действительно не хочу бросать свое собственное исключение, так как это помешает другим людям понять мой код и то, что происходит за API.

Спасибо за любой вклад!Это несколько длинно или, возможно, слишком многословно, поэтому любые изменения, которые могли бы улучшить вопрос, приветствуются.

Ответы [ 2 ]

4 голосов
/ 29 сентября 2011

AuthenticationException

Я бы скинул AuthenticationException с сообщением, если требуется логин, и неправильным именем пользователя или паролем, если пропуск не подходит.

Рекомендуется не раскрывать, существует ли логин. И иногда в HTTP часто скрывают несанкционированный доступ с не найденным. Поэтому, если учетные данные не позволяют подключиться, это похоже на то, что соединение не существует.

1 голос
/ 29 сентября 2011

Поскольку это ваш собственный 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());
...