Какое исключение бросить, если предварительный метод не был вызван? - PullRequest
6 голосов
/ 02 июля 2011

У меня есть метод getUser, который извлекает пользователя из базы данных.Метод требует, чтобы вы убедились, что пользователь действительно существует (с помощью метода userExists(String username).

Если вызывается метод getUser, а пользователь не существует, я хочу вызвать непроверенное исключение, но котороеИсключение является наиболее подходящим здесь? Я подумал о IllegalArgumentException, но это не совсем правильно, так как некоторые входные данные могут быть в порядке в некоторых случаях, но не в других - они не являются строго «незаконными». Любые предложения?

Ответы [ 3 ]

13 голосов
/ 02 июля 2011

Для меня IllegalArgumentException означает, что аргумент является незаконным и всегда будет незаконным. Исключением, которое я бы использовал, является IllegalStateException, чтобы сказать, что состояние объекта для проверки пользователя недопустимо.

Однако у вас может быть исключение, достаточно конкретное, чтобы вы могли создать свое собственное.

public class UsernameNotCheckedException extends IllegalStateException {
    public UsernameNotCheckedException(String message) {
        super(message);
    }
}

Это может упростить отладку.

A NumberFormatException является подклассом IllegalArgumentException. Если вы попытаетесь разобрать число 12QW4, это даст вам NumberFormatException, и вы ничего не сможете сделать, чтобы позже сделать это действительным аргументом. то есть это не имеет никакого отношения к состоянию чего-либо.

Javadoc для IllegalStateException состояний.

Сигналы о том, что метод был вызван в недопустимое или неподходящее время. Другими словами, среда Java или приложение Java не находятся в надлежащем состоянии для запрошенной операции.

3 голосов
/ 02 июля 2011

IllegalStateException не правильный выбор.IllegalStateException относится к состоянию объекта, метод которого был вызван - то есть состояние this неверно для вызова, как это было.В вашем случае this (т. Е. Сервер базы данных) просто в порядке, это пользователь , который является "неправильным".

IllegalArgumentException - это правильный выбор - это неправильный пользователь , а не сервер.

Другим допустимым вариантом является создание исключительной ситуации, относящейся к вашему домену, например UnknownUserException, но если это случай "редкий" или неожиданный и не подлежащий восстановлениювсе нормально придерживайтесь IllegalArgumentException

1 голос
/ 02 июля 2011

Я бы не бросил никаких исключений, а просто возвратил бы null.Или я бы вызвал функциональное исключение под названием UserDoesNotExistException.

. Вот мои рассуждения: IllegalStateException используется, когда пользователь вызывает метод, который запрещен, учитывая состояние объекта.Здесь не состояние объекта вызывает исключение.Это факт, что пользователь не существует в базе данных.

Вы можете утверждать, что пользователь должен был вызвать userExists раньше, и что этот метод мог даже запомнить, используя поле экземпляра, что он был вызван (с этим аргументом), так что IllegalStateExceptionможет быть выдан getUser даже без обращения к базе данных.

Но проблема здесь в том, что вызов userExists перед тем, как, вероятно, ничего не добавляет: он выполнит запрос, чтобы проверить, существует ли пользователь,тогда getUser выполнит второй запрос, и гарантированно не найдет пользователя, так как другая транзакция могла удалить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...