Я узнал о блоке 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 резервирование обработки исключений для реальных ошибок?