Java - простой запрос обработки исключений - PullRequest
2 голосов
/ 27 марта 2012

Просто быстрый вопрос, на который я не могу найти правильный ответ онлайн.

Когда у меня есть блок try / catch, и я хочу поймать ошибку, я должен использовать System.err.println(...)или я должен использовать throw new Exception(...).

Например:

if (null==userList || null==credentials)
    System.err.println("Did you call login() first?");
else
{
    try
    {
        currentUser=(String) userList.nextElement();
        currentPass=(String) credentials.get(currentUser);          
    }
    catch(NoSuchElementException nsee)
    {
        System.err.println("Is properties file blank?");
        //Or should this be
        throw new NoSuchElementException("Is properties file blank?");
        nsee.printStackTrace();
    }
}

РЕДАКТИРОВАТЬ: Таким образом, throw не предназначен для входа в catch?Могу ли я использовать throw вместо catch или это только для сигнатур методов ??Каков правильный способ отлова ошибки в этом случае, когда я попытаюсь убедиться, что файл свойств не пуст и содержит значения?Кроме того, для ясности, моя цель - сделать как можно более понятным пользователю, в чем заключается ошибка, чтобы они сразу знали, что им нужно исправить свой файл свойств.

Ответы [ 4 ]

2 голосов
/ 27 марта 2012

Зависит от того, что вы хотите сделать.

Если контракт вашего метода не может быть выполнен в случае исключения (т.е. вы не можете вернуть значение, которое вы намеревалисьнапример) бросить новое исключение.(Тем не менее, обратите внимание, что просто перебрасывание нового исключения не имеет большого смысла. Просто объявите метод как throws NoSuchELementException и позвольте распространению исключения.)

Если ваш контракт может быть выполнен вв случае исключения (т. е. вы можете вернуть null, если элемент не найден), тогда вы должны отловить исключение (зарегистрируйте его, используя System.err.println, если хотите), а затем продолжить выполнение.


Aпримечание к первому варианту создания нового исключения:

Вы всегда должны выбрасывать исключение, которое соответствует текущему уровню абстракции .Если, например, метод называется getUserFromList(...) и вы столкнулись с NoSuchElementException из-за какой-либо проблемы, связанной с коллекцией, вы должны перехватить исключение и выбросить NoSuchUserException.

, чтобы выделить разницу:

try {
    currentUser=(String) userList.nextElement();
    currentPass=(String) credentials.get(currentUser);          

} catch(NoSuchElementException nsee) {
              ^^^^^^^

    System.err.println("Is properties file blank?");
    throw new NoSuchUserException("Is properties file blank?");
                    ^^^^
}
1 голос
/ 27 марта 2012

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

Например, вы можете создать исключение времени выполнения с именем ConfigurationException и перебросить его следующим образом:

} catch(NoSuchElementException nsee) {
   throw new ConfigurationException("Expected non-blank properties file", nsee);
}

Как правило, лучше не регистрироваться напрямую на System.err (поскольку ваши пользователи, вероятно, не будут на это смотреть), а лучше настраивать каркас ведения журналов (log4j, slf4j, Java Logging API и т. Д.). Затем вы можете настроить регистратор на добавление в поток ошибок, если хотите.

0 голосов
/ 27 марта 2012

Это зависит от того, что вы хотите сделать.Если вам нужна только информация о том, что исключение перехвачено [например, для регистрации, вам достаточно syserr.Но если вы хотите обработать это исключение, вы должны выбросить его на верхний уровень и обработать его там или обработать внутри блока catch.В вашем случае вы должны обработать это, отправив обратно некоторую информацию о невозможности получения имени пользователя / пароля.

0 голосов
/ 27 марта 2012

Это зависит от того, что вы хотите сделать.

Если вы перезапустите исключение, функция завершится, и исключение будет перехвачено далее в стеке вызовов.

Если вы печатаете только трассировку стека, управление возвращается функции и вы можете продолжить выполнение.

Следующее, хотя и не имеет смысла:

try
{
    currentUser=(String) userList.nextElement();
    currentPass=(String) credentials.get(currentUser);          
}
catch(NoSuchElementException nsee)
{
    throw new NoSuchElementException("Is properties file blank?");
}

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

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