Является ли это Idiomati c для использования исключений C ++ только для "реальных" ошибок? - PullRequest
0 голосов
/ 26 апреля 2020

Я узнал о блоке try/catch некоторое время go. Насколько я понимаю, это используется для обработки «реальных» ошибок, таких как ошибки времени выполнения. Вместо этого я использовал его для обработки неверных попыток входа в систему, хотя это и не нужно:

void signIn(std::vector<User>& userVect, int& index, bool& isLoggedIn)
{
    std::string userNameSearchKey;
    std::string pass;
    int passwordRetry = 0;
    int userRetry = 0;
    bool keepSearching = true;
    bool userFound = false;

    while (!userFound && userRetry < 3 && userNameSearchKey != "b")
    {
        try
        {
            if (userRetry >= 3)
            {
                throw 2;
            }
            std::cout << "\nEnter a username, or 'b' to go back" << std::endl;
            std::cout << "Username: ";
            std::cin >> userNameSearchKey;
            if (userNameSearchKey == "b")
            {
                break;
            }
            std::cout << "Password: ";
            std::cin >> pass;
            for (int i = 0; i < userVect.size(); i++)
            {
                if (userNameSearchKey == userVect[i].getUserName())
                {
                    userFound = true;
                    if (pass == userVect[i].getPassword())
                    {
                        std::cout << "\nWelcome " << userVect[i].getUserName();     // Welcomes the user
                        index = i;          // When this function ends
                        isLoggedIn = true;
                    }
                    else
                    {
                        throw 1;
                    }                   
                }
            }
            if (!userFound && userNameSearchKey != "b")
            {
                throw 1;
            }
        }
        catch(int x)
        {
            if (x == 1)
            {
                std::cout << "\nError " << x << ": Incorrect username or password." << std::endl;
                userRetry++;
                if (userRetry >= 3)
                {
                    std::cout << "Too many incorrect attempts. Going back to the main menu." << std::endl;
                }
            }           
        }
    }
}

Пожалуйста, имейте в виду, что код является лишь иллюстрацией того, что я делаю: функция работает нормально и выполняет свою работу, но я мог бы получить тот же эффект без try/catch и throw. Является ли более идиоматическим c резервирование обработки исключений для реальных ошибок?

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