вернуть логическое значение или попробовать перехватить - PullRequest
0 голосов
/ 10 ноября 2018

когда функция или метод вызывают ошибку / недопустимые данные, возвращают ли false или выдают исключение? Рассмотрим класс, в котором у Логинера есть такой метод:

public boolean login(String username){
    //retrieve data...
    if(username.equals(record.username)){
        return true;
    }
    return false;
}

тогда в основном или каком-то другом классе

String username = "ggwp";
if(Loginer.login(username)){
    //successful login, show homepage...
    new User(username);
} else {
    //invalid username
}

не будет ли он неэффективным, поскольку он был проверен два раза с помощью оператора if-else, один в Loginer, а другой снова проверяет true на main. не попробует поймать будет делать то же самое? наличие логина для исключения:

public User login(String username){
    //retrieve record data...
    if(username.equals(record.username)){
        return new User(username);
    }

    /* Exception if no record found for such username */
    throw new MyException("invalid username");
}

затем на главную:

String username = "ggwp2";
User theUser;
try{
    //sucessful login
    theUser = Loginer.login(username);
}catch(MyException e){
    //invalid username
}

try-catch не нужно проверять второй раз значение true или false. (в этом примере я использую возвращаемый объект User, это может быть void и ничего не возвращать, но дело в том, зачем использовать логическое значение, которое в конечном итоге будет проверено дважды?)

некоторые источники на веб-сайтах говорят, что не нужно использовать try-catch для «перебора кода», но в этом случае он просто делает то же самое. (try-catch слишком похож на оператор if-else)

Так что правильно и почему? пожалуйста, руководство и извините, если этот вопрос неверный, я новичок в OO.

1 Ответ

0 голосов
/ 11 ноября 2018

Краткий ответ:

Вы должны НИКОГДА использовать try / catch для "логики управления".

Как сказал Энди Тернер: «Используйте исключения только для обработки исключительных условий».

Это в равной степени относится ко всем языкам, которые поддерживают исключения - не только к Java. Полезная статья:

Лучшие практики для исключений

PS: try / catch НЕ"просто похоже" на "if / else". У него другая реализация, другое намерение ... и это FAR дороже.

ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ:

Исключения: зачем бросать рано? Зачем ловить поздно?

https://softwareengineering.stackexchange.com/questions/231057/exceptions-why-throw-early-why-catch-late

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

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

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

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

  • Поймать → Ретроу

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

  • Поймать → Ручка

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

  • Catch → Ошибка возврата

    Хотя бывают ситуации, когда это уместно, ловля исключения и возврат значения ошибки вызывающей рассматривается для рефакторинга в реализацию Catch → Rethrow.

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