From 6adc50fbd5c9cb87055aefff435fa0e0705c0107 Mon Sep 17 00:00:00 2001 From: Joel Thomas <1914@trenser.com> Date: Thu, 19 Feb 2026 20:01:18 +0530 Subject: [PATCH] chore: Do exception handling to prevent appliation crash --- .../Trenser.FoodDeliveryApp/CustomerMenu.cpp | 34 ++- .../DeliveryPartnerMenu.cpp | 35 ++- .../FoodDeliveryController.cpp | 232 ++++++++++-------- .../RestaurantOwnerMenu.cpp | 44 ++-- 4 files changed, 196 insertions(+), 149 deletions(-) diff --git a/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/CustomerMenu.cpp b/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/CustomerMenu.cpp index 21b4de2..14f7d94 100644 --- a/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/CustomerMenu.cpp +++ b/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/CustomerMenu.cpp @@ -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(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(choice); + if (!handleOperation(choice)) + { + isMenuActive = false; + } + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + util::pressEnter(); } } } diff --git a/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/DeliveryPartnerMenu.cpp b/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/DeliveryPartnerMenu.cpp index e23793e..9f41d6d 100644 --- a/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/DeliveryPartnerMenu.cpp +++ b/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/DeliveryPartnerMenu.cpp @@ -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(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(choice); + if (!handleOperation(choice)) + { + isMenuActive = false; + } } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + util::pressEnter(); + } + } } diff --git a/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/FoodDeliveryController.cpp b/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/FoodDeliveryController.cpp index 456c8cf..da3f9ec 100644 --- a/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/FoodDeliveryController.cpp +++ b/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/FoodDeliveryController.cpp @@ -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(choice); - if (choice == '1') + try { - login(); - } - else if (choice == '2') + util::readValue(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(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(username, name, phone, password, email); - break; - case 2: - m_users[username] = std::make_shared(username, name, phone, password, email); - break; - case 3: - m_users[username] = std::make_shared(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(choice); + switch (choice) + { + case 1: + m_users[username] = std::make_shared(username, name, phone, password, email); + break; + case 2: + m_users[username] = std::make_shared(username, name, phone, password, email); + break; + case 3: + m_users[username] = std::make_shared(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(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(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(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(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() diff --git a/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/RestaurantOwnerMenu.cpp b/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/RestaurantOwnerMenu.cpp index 08c0115..dc69297 100644 --- a/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/RestaurantOwnerMenu.cpp +++ b/Trenser.FoodDeliveryApp/Trenser.FoodDeliveryApp/RestaurantOwnerMenu.cpp @@ -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(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(choice); + if (!handleOperation(choice)) + { + isMenuActive = false; + } + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + util::pressEnter(); } } }