chore: Do exception handling to prevent appliation crash

This commit is contained in:
Joel Thomas
2026-02-19 20:01:18 +05:30
parent ec31206437
commit 6adc50fbd5
4 changed files with 196 additions and 149 deletions
@@ -14,20 +14,28 @@ void CustomerMenu::showMenu()
bool isMenuActive = true;
while (isMenuActive)
{
int choice;
util::clear();
std::cout << "Welcome " << m_userFullName << "\n";
std::cout << "Customer Menu\n"
"1. View My Orders\n"
"2. Place Order\n"
"3. Cancel Order\n"
"4. View My Profile\n"
"5. Logout\n"
"Choice?: ";
util::readValue<int>(choice);
if (!handleOperation(choice))
try
{
isMenuActive = false;
int choice;
util::clear();
std::cout << "Welcome " << m_userFullName << "\n";
std::cout << "Customer Menu\n"
"1. View My Orders\n"
"2. Place Order\n"
"3. Cancel Order\n"
"4. View My Profile\n"
"5. Logout\n"
"Choice?: ";
util::readValue<int>(choice);
if (!handleOperation(choice))
{
isMenuActive = false;
}
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
util::pressEnter();
}
}
}
@@ -14,21 +14,30 @@ void DeliveryPartnerMenu::showMenu()
bool isMenuActive = true;
while (isMenuActive)
{
int choice;
util::clear();
std::cout << "Welcome " << m_userFullName << "\n";
std::cout << "Delivery Partner Menu\n"
"1. View My Delivery Jobs\n"
"2. Accept Delivery Job\n"
"3. Confirm Delivery\n"
"4. View My Profile\n"
"5. Logout\n"
"Choice?: ";
util::readValue<int>(choice);
if (!handleOperation(choice))
try
{
isMenuActive = false;
int choice;
util::clear();
std::cout << "Welcome " << m_userFullName << "\n";
std::cout << "Delivery Partner Menu\n"
"1. View My Delivery Jobs\n"
"2. Accept Delivery Job\n"
"3. Confirm Delivery\n"
"4. View My Profile\n"
"5. Logout\n"
"Choice?: ";
util::readValue<int>(choice);
if (!handleOperation(choice))
{
isMenuActive = false;
}
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
util::pressEnter();
}
}
}
@@ -33,31 +33,39 @@ void FoodDeliveryController::run()
bool isMenuActive = true;
while (isMenuActive)
{
char choice;
int choice;
util::clear();
std::cout << "Food Delivery App\n"
"1. Login\n"
"2. Register\n"
"3. Exit\n"
"Choice?: ";
util::readValue<char>(choice);
if (choice == '1')
try
{
login();
}
else if (choice == '2')
util::readValue<int>(choice);
if (choice == 1)
{
login();
}
else if (choice == 2)
{
registerUser();
}
else if (choice == 3)
{
break;
}
else
{
std::cout << "Invalid Choice!\n";
}
util::pressEnter();
}
catch (const std::exception& e)
{
registerUser();
std::cout << "Exception: " << e.what() << std::endl;
util::pressEnter();
}
else if (choice == '3')
{
break;
}
else
{
std::cout << "Invalid Choice!\n";
}
util::pressEnter();
}
}
@@ -109,54 +117,61 @@ void FoodDeliveryController::login()
void FoodDeliveryController::registerUser()
{
std::string username, password, phone, name, email;
util::clear();
std::cout << "Enter Username: ";
util::readString(username);
if (m_users.find(username) != m_users.end())
try
{
std::cout << "User Already Exists!\n";
return;
}
std::cout << "Enter Password: ";
util::readString(password);
std::cout << "Enter Full Name: ";
util::readString(name);
std::cout << "Enter Phone: ";
util::readString(phone);
std::cout << "Enter Email: ";
util::readString(email);
while (true)
{
int choice;
std::cout << "Select User Type\n"
"1. Restaurant Owner\n"
"2. Customer\n"
"3. Delivery Partner\n"
"4. Cancel\n"
"Choice?: ";
util::readValue<int>(choice);
switch (choice)
std::string username, password, phone, name, email;
util::clear();
std::cout << "Enter Username: ";
util::readString(username);
if (m_users.find(username) != m_users.end())
{
case 1:
m_users[username] = std::make_shared<RestaurantOwner>(username, name, phone, password, email);
break;
case 2:
m_users[username] = std::make_shared<Customer>(username, name, phone, password, email);
break;
case 3:
m_users[username] = std::make_shared<DeliveryPartner>(username, name, phone, password, email);
break;
case 4:
std::cout << "User Already Exists!\n";
return;
default:
util::clear();
std::cout << "Invalid Choice! Try Again\n";
continue;
}
break;
}
std::cout << "User Registration Successful\n";
std::cout << "Enter Password: ";
util::readString(password);
std::cout << "Enter Full Name: ";
util::readString(name);
std::cout << "Enter Phone: ";
util::readString(phone);
std::cout << "Enter Email: ";
util::readString(email);
while (true)
{
int choice;
std::cout << "Select User Type\n"
"1. Restaurant Owner\n"
"2. Customer\n"
"3. Delivery Partner\n"
"4. Cancel\n"
"Choice?: ";
util::readValue<int>(choice);
switch (choice)
{
case 1:
m_users[username] = std::make_shared<RestaurantOwner>(username, name, phone, password, email);
break;
case 2:
m_users[username] = std::make_shared<Customer>(username, name, phone, password, email);
break;
case 3:
m_users[username] = std::make_shared<DeliveryPartner>(username, name, phone, password, email);
break;
case 4:
return;
default:
util::clear();
std::cout << "Invalid Choice! Try Again\n";
continue;
}
break;
}
std::cout << "User Registration Successful\n";
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
}
}
void FoodDeliveryController::listRestaurants()
@@ -207,56 +222,63 @@ void FoodDeliveryController::addNewRestaurant()
void FoodDeliveryController::updateRestaurantStatus()
{
util::clear();
if (!checkAccess(m_authenticatedUser, "RestaurantOwner"))
try
{
return;
}
RestaurantOwner& restaurantOwner = *(std::dynamic_pointer_cast<RestaurantOwner>(m_authenticatedUser));
restaurants& ownerRestaurants = restaurantOwner.getRestaurants();
int restaurantChoiceIndex;
if (ownerRestaurants.empty())
{
std::cout << "You do not own any Restaurants!\n";
return;
}
std::cout << "Pick a Restaurant to Open/Close\n";
std::cout << std::left << std::setw(8) << "Index"
<< std::left << std::setw(5) << "ID"
<< std::left << std::setw(25) << "Name"
<< std::left << std::setw(10) << "Status"
<< "\n";
int restaurantIndex = 1;
for (restaurants::iterator restaurantIterator = ownerRestaurants.begin(); restaurantIterator != ownerRestaurants.end(); restaurantIterator++, restaurantIndex++)
{
auto& restaurant = *(restaurantIterator->second);
std::cout
<< std::left << std::setw(8) << restaurantIndex
<< std::left << std::setw(5) << restaurant.getId()
<< std::left << std::setw(25) << restaurant.getName()
<< std::left << std::setw(10) << (restaurant.getStatus() ? "Open" : "Closed")
util::clear();
if (!checkAccess(m_authenticatedUser, "RestaurantOwner"))
{
return;
}
RestaurantOwner& restaurantOwner = *(std::dynamic_pointer_cast<RestaurantOwner>(m_authenticatedUser));
restaurants& ownerRestaurants = restaurantOwner.getRestaurants();
int restaurantChoiceIndex;
if (ownerRestaurants.empty())
{
std::cout << "You do not own any Restaurants!\n";
return;
}
std::cout << "Pick a Restaurant to Open/Close\n";
std::cout << std::left << std::setw(8) << "Index"
<< std::left << std::setw(5) << "ID"
<< std::left << std::setw(25) << "Name"
<< std::left << std::setw(10) << "Status"
<< "\n";
int restaurantIndex = 1;
for (restaurants::iterator restaurantIterator = ownerRestaurants.begin(); restaurantIterator != ownerRestaurants.end(); restaurantIterator++, restaurantIndex++)
{
auto& restaurant = *(restaurantIterator->second);
std::cout
<< std::left << std::setw(8) << restaurantIndex
<< std::left << std::setw(5) << restaurant.getId()
<< std::left << std::setw(25) << restaurant.getName()
<< std::left << std::setw(10) << (restaurant.getStatus() ? "Open" : "Closed")
<< "\n";
}
std::cout << "\nSelect Index: ";
util::readValue<int>(restaurantChoiceIndex);
restaurantChoiceIndex--;
if (restaurantChoiceIndex < 0 || restaurantChoiceIndex >= ownerRestaurants.size())
{
std::cout << "Invalid Index. Cannot update Restaurant status!\n";
return;
}
restaurants::iterator restaurantIterator = ownerRestaurants.begin();
std::advance(restaurantIterator, restaurantChoiceIndex);
if (restaurantIterator->second->getStatus() == true)
{
restaurantIterator->second->setStatus(false);
}
else
{
restaurantIterator->second->setStatus(true);
}
listRestaurants();
std::cout << "Updated Restaurant " << restaurantIterator->second->getName() << " successfully\n";
}
std::cout << "\nSelect Index: ";
util::readValue<int>(restaurantChoiceIndex);
restaurantChoiceIndex--;
if (restaurantChoiceIndex < 0 || restaurantChoiceIndex >= ownerRestaurants.size())
catch (const std::exception& e)
{
std::cout << "Invalid Index. Cannot update Restaurant status!\n";
return;
std::cout << "Exception: " << e.what() << std::endl;
}
restaurants::iterator restaurantIterator = ownerRestaurants.begin();
std::advance(restaurantIterator, restaurantChoiceIndex);
if (restaurantIterator->second->getStatus() == true)
{
restaurantIterator->second->setStatus(false);
}
else
{
restaurantIterator->second->setStatus(true);
}
listRestaurants();
std::cout << "Updated Restaurant " << restaurantIterator->second->getName() << " successfully\n";
}
void FoodDeliveryController::listRestaurantOrders()
@@ -14,25 +14,33 @@ void RestaurantOwnerMenu::showMenu()
bool isMenuActive = true;
while (isMenuActive)
{
int choice;
util::clear();
std::cout << "Welcome " << m_userFullName << "\n";
std::cout << "Restaurant Owner Menu\n"
"1. List My Restaurants\n"
"2. Add New Restaurant\n"
"3. Update Restaurant Status\n"
"4. List Orders\n"
"5. Mark Order Ready for Delivery\n"
"6. List Menu Items\n"
"7. Add New Item to Menu\n"
"8. Remove Item from Menu\n"
"9. View My Profile\n"
"10. Logout\n"
"Choice?: ";
util::readValue<int>(choice);
if (!handleOperation(choice))
try
{
isMenuActive = false;
int choice;
util::clear();
std::cout << "Welcome " << m_userFullName << "\n";
std::cout << "Restaurant Owner Menu\n"
"1. List My Restaurants\n"
"2. Add New Restaurant\n"
"3. Update Restaurant Status\n"
"4. List Orders\n"
"5. Mark Order Ready for Delivery\n"
"6. List Menu Items\n"
"7. Add New Item to Menu\n"
"8. Remove Item from Menu\n"
"9. View My Profile\n"
"10. Logout\n"
"Choice?: ";
util::readValue<int>(choice);
if (!handleOperation(choice))
{
isMenuActive = false;
}
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
util::pressEnter();
}
}
}