Obsługa wszystkich wyjątków
Część sekcji Logika i przepływ programu ścieżki C++ w Coddy. Lekcja 52 z 56.
Czasami Twój program może napotkać nieoczekiwane błędy, które nie pasują do konkretnych typów wyjątków, na które się przygotowałeś. Ogólny program obsługi catch(...) stanowi zabezpieczenie, które przechwytuje każdy wyjątek nieobsłużony przez bardziej szczegółowe bloki catch.
Procedura obsługi wszystkich wyjątków używa trzech kropek (...) zamiast określania konkretnego typu wyjątku. Musi być umieszczona po wszystkich pozostałych blokach catch, ponieważ C++ sprawdza je po kolei:
try {
// Kod, który może zgłaszać różne wyjątki
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}Procedura obsługi przechwytująca wszystkie wyjątki działa jako zabezpieczenie na wypadek każdego typu wyjątku, który nie został przechwycony przez poprzednie bloki. Jest to szczególnie przydatne podczas pracy z kodem, który może zgłaszać wyjątki, których się nie spodziewasz, dzięki czemu Twój program nie ulegnie awarii z powodu nieoczekiwanych błędów.
Chociaż nie możesz uzyskać dostępu do szczegółowych informacji o wyjątku w bloku przechwytującym wszystkie wyjątki, nadal możesz wyświetlić ogólny komunikat o błędzie i wykonać operacje porządkowe, aby program działał bez zakłóceń.
Wyzwanie
ŁatwyUtwórz program demonstrujący kompleksową obsługę wyjątków za pomocą wielu bloków catch, w tym obsługi przechwytującej wszystkie wyjątki. To wyzwanie sprawdzi, czy rozumiesz, jak obsługiwać zarówno konkretne typy wyjątków, jak i nieoczekiwane błędy, które nie pasują do wcześniej zdefiniowanych kategorii.
Podane zostaną następujące dane wejściowe:
- Łańcuch znaków
testTypeokreślający typ testu do wykonania ("string_convert","math_operation","array_access"lub"unknown_error") - Łańcuch znaków
value1, który zostanie użyty jako podstawowe dane operacji - Łańcuch znaków
value2, który zostanie użyty jako dodatkowe dane w niektórych operacjach
Twój program powinien:
- Utworzyć funkcję o nazwie
performTest, która przyjmuje trzy parametry typu łańcuch znaków - Wewnątrz funkcji użyć struktury if-else do obsługi różnych typów testów:
- Jeśli testType ma wartość
"string_convert": użyćstd::stoido konwersji value1 na liczbę całkowitą i ją wypisać - Jeśli testType ma wartość
"math_operation": przekonwertować zarówno value1, jak i value2 na liczby całkowite za pomocąstd::stoi, następnie podzielić value1 przez value2 i wypisać wynik - Jeśli testType ma wartość
"array_access": utworzyć łańcuch znaków"Programming", przekonwertować value1 na indeks całkowity za pomocąstd::stoi, następnie użyćstr.at(index), aby uzyskać znak pod tym indeksem i go wypisać. Metoda.at()automatycznie zgłasza wyjątekstd::out_of_range, jeśli indeks jest nieprawidłowy: nie trzeba ręcznie sprawdzać granic - Jeśli testType ma wartość
"unknown_error": zgłosić wyjątek o wartości całkowitej999 - W funkcji main wywołać
performTestwewnątrz blokutry - Użyć wielu bloków
catchdo obsługi wyjątków w następującej dokładnej kolejności: - Po pierwsze:
std::invalid_argument&w przypadku nieprawidłowych konwersji z łańcucha znaków na liczbę - Po drugie:
std::out_of_range&w przypadku liczb zbyt dużych lub indeksu łańcucha znaków wykraczającego poza zakres - Po trzecie:
catch(...)jako obsługa przechwytująca wszystkie inne typy wyjątków
Użyj następującego dokładnego formatu wyjściowego:
W przypadku pomyślnych operacji:
Success: [result_value]W przypadku różnych typów wyjątków:
Invalid argument caught
Out of range caught
Unknown exception caughtPamiętaj, że obsługa przechwytująca wszystkie wyjątki catch(...) musi znajdować się na końcu, ponieważ C++ sprawdza bloki catch po kolei. Ta obsługa przechwyci każdy typ wyjątku, który nie został obsłużony przez wcześniejsze bloki catch dla konkretnych typów, w tym wyjątek całkowity zgłaszany w przypadku "unknown_error". Obsługa przechwytująca wszystkie wyjątki stanowi zabezpieczenie przed nieoczekiwanymi błędami, a jednocześnie pozwala na konkretne postępowanie ze znanymi typami wyjątków.
Spróbuj swoich sił
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO: Napisz tutaj swój kod – utwórz funkcję performTest
int main() {
// Wczytaj dane wejściowe
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: Napisz swój kod poniżej – zaimplementuj bloki try-catch i wywołaj performTest
return 0;
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Wskaźniki i pamięć
Czym jest wskaźnik?Operator pobrania adresuOperator dereferencjiWskaźniki zeroweWskaźniki i tabliceDynamiczne zarządzanie pamięcią za pomocą „new”Zwalnianie pamięci za pomocą „delete”Podsumowanie — ćwiczenia ze wskaźnikami2Wektory (tablice dynamiczne)
Wprowadzenie do std::vectorTworzenie wektoraDodawanie elementówDostęp do elementówRozmiar wektoraIterowanie za pomocą pętli forPętla for oparta na zakresieUsuwanie elementówPodsumowanie — operacje na wektorach5Projekt: Narzędzie do zarządzania zapasami
Konfiguracja projektuDodawanie i aktualizowanie produktów8Podstawy obsługi błędów
Wprowadzenie do wyjątkówBloki „try” i „catch”Słowo kluczowe „throw”Różne typy wyjątkówObsługa wszystkich wyjątkówPodsumowanie — bezpieczne dzielenie3Projekt: narzędzie do listy zadań
Przegląd projektuDodawanie zadaniaPoćwicz samodzielnie: Kompilator C++ online